From 0a3bff964a82c0ef9d18041c43e1b02ffa1cd9c0 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Mon, 24 May 2021 15:59:43 +0800 Subject: [PATCH 001/341] add jsonrpc --- framework/build.gradle | 2 ++ .../core/services/jsonrpc/JsonRpcServer.java | 27 +++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServer.java diff --git a/framework/build.gradle b/framework/build.gradle index 18329ce2e7c..3ce7afe8ff1 100644 --- a/framework/build.gradle +++ b/framework/build.gradle @@ -79,6 +79,8 @@ dependencies { compile group: 'org.apache.httpcomponents', name: 'httpasyncclient', version: '4.1.1' // end http + implementation('com.github.briandilley.jsonrpc4j:jsonrpc4j:1.6') + compile "io.vavr:vavr:0.9.2" compile group: 'org.pf4j', name: 'pf4j', version: '2.5.0' diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServer.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServer.java new file mode 100644 index 00000000000..337ef24d1ac --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServer.java @@ -0,0 +1,27 @@ +package org.tron.core.services.jsonrpc; + +import org.tron.common.application.Service; +import org.tron.common.parameter.CommonParameter; + +public class JsonRpcServer implements Service { + + + @Override + public void init() { + + } + + @Override + public void init(CommonParameter parameter) { + + } + + @Override + public void start() { + + } + + @Override + public void stop() { + } +} From 24fbd4515669628db722c2ef5a345d10d0ba028d Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Tue, 25 May 2021 15:32:01 +0800 Subject: [PATCH 002/341] feat: add jsonrpc demo --- framework/build.gradle | 3 + .../core/services/jsonrpc/ClientDemo.java | 46 ++++++++++ .../jsonrpc/FullNodeJsonRpcHttpService.java | 85 +++++++++++++++++++ .../jsonrpc/FullNodeJsonRpcStreamService.java | 80 +++++++++++++++++ .../core/services/jsonrpc/JsonRpcServer.java | 27 ------ .../core/services/jsonrpc/JsonRpcServlet.java | 46 ++++++++++ .../core/services/jsonrpc/TestService.java | 5 ++ .../services/jsonrpc/TestServiceImpl.java | 7 ++ .../main/java/org/tron/program/FullNode.java | 10 +++ 9 files changed, 282 insertions(+), 27 deletions(-) create mode 100644 framework/src/main/java/org/tron/core/services/jsonrpc/ClientDemo.java create mode 100644 framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java create mode 100644 framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcStreamService.java delete mode 100644 framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServer.java create mode 100644 framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java create mode 100644 framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java create mode 100644 framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java diff --git a/framework/build.gradle b/framework/build.gradle index 3ce7afe8ff1..1fe421c0b9e 100644 --- a/framework/build.gradle +++ b/framework/build.gradle @@ -81,6 +81,9 @@ dependencies { implementation('com.github.briandilley.jsonrpc4j:jsonrpc4j:1.6') + // https://mvnrepository.com/artifact/javax.portlet/portlet-api + compileOnly group: 'javax.portlet', name: 'portlet-api', version: '2.0' + compile "io.vavr:vavr:0.9.2" compile group: 'org.pf4j', name: 'pf4j', version: '2.5.0' diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/ClientDemo.java b/framework/src/main/java/org/tron/core/services/jsonrpc/ClientDemo.java new file mode 100644 index 00000000000..9779afa0f78 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/ClientDemo.java @@ -0,0 +1,46 @@ +package org.tron.core.services.jsonrpc; + +import com.googlecode.jsonrpc4j.JsonRpcClient; +import com.googlecode.jsonrpc4j.JsonRpcServer; +import com.googlecode.jsonrpc4j.ProxyUtil; +import com.googlecode.jsonrpc4j.StreamServer; +import java.io.IOException; +import java.net.InetAddress; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.tron.common.parameter.CommonParameter; + +public class ClientDemo { + + // private int port = Args.getInstance().getRpcOnSolidityPort() + 1; + private int port = 8099; + private JsonRpcServer jsonRpcServer; + private StreamServer streamServer; + + + public void client() throws Throwable { + InetAddress bindAddress = InetAddress.getByName("127.0.0.1"); + Socket socket = new Socket(bindAddress, port); + JsonRpcClient jsonRpcClient = new JsonRpcClient(); + + // Map params = new HashMap(); + // params.put("a", 3); + // params.put("b", 4); + List params = new ArrayList<>(); + params.add(12); + + Integer res = jsonRpcClient.invokeAndReadResponse("getInt", params, Integer.class, + socket.getOutputStream(), socket.getInputStream()); + System.out.println(res); //传参方法三:通过ProxyUtil 客户端调用 + + } + + public static void main(String[] args) throws Throwable { + ClientDemo demo = new ClientDemo(); + demo.client(); + } +} diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java new file mode 100644 index 00000000000..3ccc54427a7 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java @@ -0,0 +1,85 @@ +package org.tron.core.services.jsonrpc; + +import com.googlecode.jsonrpc4j.JsonRpcServer; +import com.googlecode.jsonrpc4j.ProxyUtil; +import com.googlecode.jsonrpc4j.StreamServer; +import java.io.IOException; +import java.net.InetAddress; +import java.net.ServerSocket; +import java.util.EnumSet; +import javax.net.ServerSocketFactory; +import javax.servlet.DispatcherType; +import javax.servlet.Filter; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.servlet.FilterHolder; +import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.servlet.ServletHandler; +import org.eclipse.jetty.servlet.ServletHolder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.common.application.Service; +import org.tron.common.parameter.CommonParameter; +import org.tron.core.config.args.Args; +import org.tron.core.services.filter.HttpInterceptor; + +@Component +@Slf4j(topic = "API") +public class FullNodeJsonRpcHttpService implements Service { + + // private int port = Args.getInstance().getFullNodeHttpPort(); + private int port = 8080; + + private Server server; + + @Autowired + private JsonRpcServlet jsonRpcServlet; + + @Override + public void init() { + } + + @Override + public void init(CommonParameter args) { + } + + // protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException { + // jsonRpcServer.handle(req, resp); + // } + + @Override + public void start() { + try { + server = new Server(port); + ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); + context.setContextPath("/"); + server.setHandler(context); + + context.addServlet(new ServletHolder(jsonRpcServlet), "/rpc"); + + // filter + // ServletHandler handler = new ServletHandler(); + // FilterHolder fh = handler + // .addFilterWithMapping((Class) HttpInterceptor.class, "/*", + // EnumSet.of(DispatcherType.REQUEST)); + // context.addFilter(fh, "/*", EnumSet.of(DispatcherType.REQUEST)); + + server.start(); + + } catch (Exception e) { + logger.debug("IOException: {}", e.getMessage()); + } + } + + @Override + public void stop() { + try { + server.stop(); + } catch (Exception e) { + logger.debug("IOException: {}", e.getMessage()); + } + } +} diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcStreamService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcStreamService.java new file mode 100644 index 00000000000..cf94f13c01b --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcStreamService.java @@ -0,0 +1,80 @@ +package org.tron.core.services.jsonrpc; + +import com.googlecode.jsonrpc4j.JsonRpcServer; +import com.googlecode.jsonrpc4j.ProxyUtil; +import com.googlecode.jsonrpc4j.StreamServer; +import java.io.IOException; +import java.net.InetAddress; +import java.net.ServerSocket; +import javax.net.ServerSocketFactory; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.tron.common.application.Service; +import org.tron.common.parameter.CommonParameter; +import org.tron.core.config.args.Args; + +@Component +@Slf4j(topic = "API") +// public class FullNodeJsonRpcService extends HttpServlet { +public class FullNodeJsonRpcStreamService implements Service { + + // private int port = Args.getInstance().getFullNodeHttpPort(); + private int port = 8099; + + private JsonRpcServer jsonRpcServer; + private TestService testService; + private StreamServer streamServer; + + @Override + public void init() { + } + + @Override + public void init(CommonParameter args) { + } + + // protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException { + // jsonRpcServer.handle(req, resp); + // } + + @Override + public void start() { + testService = new TestServiceImpl(); + + Object compositeService = ProxyUtil.createCompositeServiceProxy( + this.getClass().getClassLoader(), + new Object[] { testService}, + new Class[] { TestService.class}, + true); + + jsonRpcServer = new JsonRpcServer(compositeService); + + + // create the stream server + int maxThreads = 50; + ServerSocket serverSocket; + try { + // serverSocket = new ServerSocket(port); + InetAddress bindAddress = InetAddress.getByName("127.0.0.1"); + serverSocket = ServerSocketFactory.getDefault().createServerSocket(port, 0, bindAddress); + } catch (Exception e) { + return; + } + streamServer = new StreamServer(jsonRpcServer, maxThreads, serverSocket); + +// start it, this method doesn't block + streamServer.start(); + } + + @Override + public void stop() { + try { + streamServer.stop(); + } catch (Exception e) { + logger.debug("IOException: {}", e.getMessage()); + } + } +} diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServer.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServer.java deleted file mode 100644 index 337ef24d1ac..00000000000 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServer.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.tron.core.services.jsonrpc; - -import org.tron.common.application.Service; -import org.tron.common.parameter.CommonParameter; - -public class JsonRpcServer implements Service { - - - @Override - public void init() { - - } - - @Override - public void init(CommonParameter parameter) { - - } - - @Override - public void start() { - - } - - @Override - public void stop() { - } -} diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java new file mode 100644 index 00000000000..95c0aedc68b --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java @@ -0,0 +1,46 @@ +package org.tron.core.services.jsonrpc; + +import com.googlecode.jsonrpc4j.JsonRpcServer; +import com.googlecode.jsonrpc4j.ProxyUtil; +import java.io.IOException; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j(topic = "API") +public class JsonRpcServlet extends HttpServlet { + private static final long serialVersionUID = 12341234345L; + private JsonRpcServer rpcServer = null; + private TestService testService = null; + + // @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + testService = new TestServiceImpl(); + Object compositeService = ProxyUtil.createCompositeServiceProxy( + this.getClass().getClassLoader(), + new Object[] { testService}, + new Class[] { TestService.class}, + true); + + rpcServer = new JsonRpcServer(compositeService); + } + + // @Override + // protected void service(HttpServletRequest request, + // HttpServletResponse response) throws ServletException, IOException { + // rpcServer.handle(request, response); + // } + + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { + rpcServer.handle(req, resp); + } + + + +} \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java new file mode 100644 index 00000000000..3c9dddef461 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java @@ -0,0 +1,5 @@ +package org.tron.core.services.jsonrpc; + +public interface TestService { + int getInt(int code); +} \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java new file mode 100644 index 00000000000..4c66f2600b5 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java @@ -0,0 +1,7 @@ +package org.tron.core.services.jsonrpc; + +public class TestServiceImpl implements TestService { + public int getInt(int code) { + return code; + } +} \ No newline at end of file diff --git a/framework/src/main/java/org/tron/program/FullNode.java b/framework/src/main/java/org/tron/program/FullNode.java index 3d3d0f9bd8e..4e8d42ae9b8 100644 --- a/framework/src/main/java/org/tron/program/FullNode.java +++ b/framework/src/main/java/org/tron/program/FullNode.java @@ -19,6 +19,8 @@ import org.tron.core.services.interfaceOnPBFT.http.PBFT.HttpApiOnPBFTService; import org.tron.core.services.interfaceOnSolidity.RpcApiServiceOnSolidity; import org.tron.core.services.interfaceOnSolidity.http.solidity.HttpApiOnSolidityService; +import org.tron.core.services.jsonrpc.FullNodeJsonRpcHttpService; +import org.tron.core.services.jsonrpc.FullNodeJsonRpcStreamService; @Slf4j(topic = "app") public class FullNode { @@ -82,6 +84,14 @@ public static void main(String[] args) { appT.addService(httpApiService); } + // json-rpc api server + FullNodeJsonRpcStreamService jsonRpcStreamService = context.getBean(FullNodeJsonRpcStreamService.class); + FullNodeJsonRpcHttpService jsonRpcHttpService = context.getBean(FullNodeJsonRpcHttpService.class); + if (CommonParameter.getInstance().fullNodeHttpEnable) { + appT.addService(jsonRpcStreamService); + appT.addService(jsonRpcHttpService); + } + // full node and solidity node fuse together // provide solidity rpc and http server on the full node. if (Args.getInstance().getStorage().getDbVersion() == dbVersion) { From b64524d103198026b6cc1d7081e8a08ea7bfbfef Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Tue, 25 May 2021 15:33:16 +0800 Subject: [PATCH 003/341] add JsonRpcSocketService --- .../core/services/jsonrpc/JsonRpcServer.java | 27 ------- .../jsonrpc/JsonRpcSocketService.java | 76 +++++++++++++++++++ .../main/java/org/tron/program/FullNode.java | 7 +- 3 files changed, 82 insertions(+), 28 deletions(-) delete mode 100644 framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServer.java create mode 100644 framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcSocketService.java diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServer.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServer.java deleted file mode 100644 index 337ef24d1ac..00000000000 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServer.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.tron.core.services.jsonrpc; - -import org.tron.common.application.Service; -import org.tron.common.parameter.CommonParameter; - -public class JsonRpcServer implements Service { - - - @Override - public void init() { - - } - - @Override - public void init(CommonParameter parameter) { - - } - - @Override - public void start() { - - } - - @Override - public void stop() { - } -} diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcSocketService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcSocketService.java new file mode 100644 index 00000000000..46e6d8889ef --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcSocketService.java @@ -0,0 +1,76 @@ +package org.tron.core.services.jsonrpc; + +import com.googlecode.jsonrpc4j.JsonRpcServer; +import com.googlecode.jsonrpc4j.ProxyUtil; +import com.googlecode.jsonrpc4j.StreamServer; +import java.io.IOException; +import java.net.InetAddress; +import java.net.ServerSocket; +import javax.net.ServerSocketFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.common.application.Service; +import org.tron.common.parameter.CommonParameter; + +@Component +public class JsonRpcService implements Service { + + private int port = 50063; + + @Autowired + private AddService addService; + private JsonRpcServer jsonRpcServer; + private StreamServer streamServer; + + @Override + public void init() { + } + + @Override + public void init(CommonParameter parameter) { + } + + @Override + public void start() { + + Object compositeService = ProxyUtil.createCompositeServiceProxy( + this.getClass().getClassLoader(), + new Object[] {new AddService()}, + new Class[] {AddInterface.class}, //interface类名 + true); + jsonRpcServer = new JsonRpcServer(compositeService); + jsonRpcServer.setContentType("application/json-rpc"); + + // create the stream server + int maxThreads = 50; + + ServerSocket serverSocket = null; + try { + InetAddress bindAddress = InetAddress.getByName("localhost"); + serverSocket = ServerSocketFactory.getDefault().createServerSocket(port, 0, bindAddress); + } catch (IOException e) { + e.printStackTrace(); + } + streamServer = new StreamServer(jsonRpcServer, maxThreads, serverSocket); + + // start it, this method doesn't block + streamServer.start(); + + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + System.err.println("*** shutting down jsonrpc server on solidity since JVM is shutting down"); + //server.this.stop(); + System.err.println("*** jsonrpc server on solidity shut down"); + })); + } + + @Override + public void stop() { + if (streamServer != null) { + try { + streamServer.stop(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } +} diff --git a/framework/src/main/java/org/tron/program/FullNode.java b/framework/src/main/java/org/tron/program/FullNode.java index 3d3d0f9bd8e..b0feb448069 100644 --- a/framework/src/main/java/org/tron/program/FullNode.java +++ b/framework/src/main/java/org/tron/program/FullNode.java @@ -19,10 +19,11 @@ import org.tron.core.services.interfaceOnPBFT.http.PBFT.HttpApiOnPBFTService; import org.tron.core.services.interfaceOnSolidity.RpcApiServiceOnSolidity; import org.tron.core.services.interfaceOnSolidity.http.solidity.HttpApiOnSolidityService; +import org.tron.core.services.jsonrpc.JsonRpcSocketService; @Slf4j(topic = "app") public class FullNode { - + public static final int dbVersion = 2; public static void load(String path) { @@ -82,6 +83,10 @@ public static void main(String[] args) { appT.addService(httpApiService); } + // jsonrpc api server + JsonRpcSocketService jsonRpcSocketService1 = context.getBean(JsonRpcSocketService.class); + appT.addService(jsonRpcSocketService1); + // full node and solidity node fuse together // provide solidity rpc and http server on the full node. if (Args.getInstance().getStorage().getDbVersion() == dbVersion) { From e111befaa30cc4937e5ba0eb062220862d0263c7 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 26 May 2021 14:45:10 +0800 Subject: [PATCH 004/341] add 3 rpc api --- .../jsonrpc/FullNodeJsonRpcHttpService.java | 6 +-- .../jsonrpc/FullNodeJsonRpcStreamService.java | 14 +++++-- .../core/services/jsonrpc/JsonRpcServlet.java | 21 ++++++++--- .../core/services/jsonrpc/TestService.java | 15 ++++++++ .../services/jsonrpc/TestServiceImpl.java | 37 +++++++++++++++++++ 5 files changed, 81 insertions(+), 12 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java index 3ccc54427a7..5ea78a3591f 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java @@ -30,8 +30,8 @@ @Slf4j(topic = "API") public class FullNodeJsonRpcHttpService implements Service { - // private int port = Args.getInstance().getFullNodeHttpPort(); - private int port = 8080; + private int port = Args.getInstance().getFullNodeHttpPort() + 8; //8098 +// private int port = 8098; private Server server; @@ -58,7 +58,7 @@ public void start() { context.setContextPath("/"); server.setHandler(context); - context.addServlet(new ServletHolder(jsonRpcServlet), "/rpc"); + context.addServlet(new ServletHolder(jsonRpcServlet), "/"); // filter // ServletHandler handler = new ServletHandler(); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcStreamService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcStreamService.java index afda4f00ba6..b7a96bb7097 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcStreamService.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcStreamService.java @@ -11,10 +11,13 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.tron.common.application.Service; import org.tron.common.parameter.CommonParameter; +import org.tron.core.Wallet; import org.tron.core.config.args.Args; +import org.tron.core.services.NodeInfoService; @Component @Slf4j(topic = "API") @@ -23,9 +26,14 @@ public class FullNodeJsonRpcStreamService implements Service { private int port = 8099; private JsonRpcServer jsonRpcServer; - private TestService testService; + private TestServiceImpl testServiceImpl; private StreamServer streamServer; + @Autowired + private NodeInfoService nodeInfoService; + @Autowired + private Wallet wallet; + @Override public void init() { } @@ -36,11 +44,11 @@ public void init(CommonParameter args) { @Override public void start() { - testService = new TestServiceImpl(); + testServiceImpl = new TestServiceImpl(nodeInfoService, wallet); Object compositeService = ProxyUtil.createCompositeServiceProxy( this.getClass().getClassLoader(), - new Object[] {testService}, + new Object[] {testServiceImpl}, new Class[] {TestService.class}, true); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java index a62a3a61fc8..fb869377ac4 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java @@ -5,27 +5,36 @@ import java.io.IOException; import javax.servlet.ServletConfig; import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.tron.core.Wallet; +import org.tron.core.services.NodeInfoService; +import org.tron.core.services.http.RateLimiterServlet; @Component @Slf4j(topic = "API") -public class JsonRpcServlet extends HttpServlet { +public class JsonRpcServlet extends RateLimiterServlet { + private static final long serialVersionUID = 12341234345L; private JsonRpcServer rpcServer = null; - private TestService testService = null; + private TestServiceImpl testServiceImpl; + + @Autowired + private NodeInfoService nodeInfoService; + @Autowired + private Wallet wallet; // @Override public void init(ServletConfig config) throws ServletException { super.init(config); - testService = new TestServiceImpl(); + testServiceImpl = new TestServiceImpl(nodeInfoService, wallet); Object compositeService = ProxyUtil.createCompositeServiceProxy( this.getClass().getClassLoader(), - new Object[] { testService}, - new Class[] { TestService.class}, + new Object[] {testServiceImpl}, + new Class[] {TestService.class}, true); rpcServer = new JsonRpcServer(compositeService); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java index 3c9dddef461..96b56e7c617 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java @@ -1,5 +1,20 @@ package org.tron.core.services.jsonrpc; +import com.googlecode.jsonrpc4j.JsonRpcMethod; +import org.springframework.stereotype.Component; + +@Component public interface TestService { + + @JsonRpcMethod("getInt") int getInt(int code); + + @JsonRpcMethod("net_version") + int getNetVersion(); + + @JsonRpcMethod("net_listening") + boolean isListening(); + + @JsonRpcMethod("eth_protocolVersion") + int getProtocolVersion(); } \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java index 4c66f2600b5..b17bb2a51fc 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java @@ -1,7 +1,44 @@ package org.tron.core.services.jsonrpc; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.core.Wallet; +import org.tron.core.services.NodeInfoService; + +@Component public class TestServiceImpl implements TestService { + + private NodeInfoService nodeInfoService; + private Wallet wallet; + + public TestServiceImpl() { + } + + public TestServiceImpl(NodeInfoService nodeInfoService, Wallet wallet) { + this.nodeInfoService = nodeInfoService; + this.wallet = wallet; + } + + @Override public int getInt(int code) { return code; } + + @Override + public int getNetVersion() { + //当前链的id,不能跟metamask已有的id冲突 + return 100; + } + + @Override + public boolean isListening() { + int activeConnectCount = nodeInfoService.getNodeInfo().getActiveConnectCount(); + return activeConnectCount >= 1; + } + + @Override + public int getProtocolVersion() { + //当前块的版本号。实际是与代码版本对应的。 + return wallet.getNowBlock().getBlockHeader().getRawData().getVersion(); + } } \ No newline at end of file From 2cccc0d1f7f654285afc713ed6955874c5167661 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 26 May 2021 15:24:52 +0800 Subject: [PATCH 005/341] feat: add web3_sha3 and web3_clientVersion --- .../java/org/tron/common/utils/ByteArray.java | 9 +++++++ .../core/services/jsonrpc/TestService.java | 3 +++ .../services/jsonrpc/TestServiceImpl.java | 26 +++++++++++++++++++ 3 files changed, 38 insertions(+) diff --git a/common/src/main/java/org/tron/common/utils/ByteArray.java b/common/src/main/java/org/tron/common/utils/ByteArray.java index 16b1c829520..5a2e669b3dc 100644 --- a/common/src/main/java/org/tron/common/utils/ByteArray.java +++ b/common/src/main/java/org/tron/common/utils/ByteArray.java @@ -107,6 +107,15 @@ public static byte[] fromObject(Object obj) { return bytes; } + /** + * Stringify byte[] x + * null for null + * null for empty [] + */ + public static String toJsonHex(byte[] x) { + return x == null || x.length == 0 ? null : "0x" + Hex.toHexString(x); + } + /** * Generate a subarray of a given byte array. * diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java index 3c9dddef461..0cab00e4b99 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java @@ -2,4 +2,7 @@ public interface TestService { int getInt(int code); + + String web3_clientVersion(); + String web3_sha3(String data) throws Exception; } \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java index 4c66f2600b5..1ac1ffef9cf 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java @@ -1,7 +1,33 @@ package org.tron.core.services.jsonrpc; +import java.util.Arrays; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import org.tron.common.crypto.Hash; +import org.tron.common.utils.ByteArray; +import org.tron.program.Version; + public class TestServiceImpl implements TestService { public int getInt(int code) { return code; } + + public String web3_clientVersion() { + Pattern shortVersion = Pattern.compile("(\\d\\.\\d).*"); + Matcher matcher = shortVersion.matcher(System.getProperty("java.version")); + matcher.matches(); + + return Arrays.asList( + "TRON", "v" + Version.getVersion(), + System.getProperty("os.name"), + "Java" + matcher.group(1), + Version.VERSION_NAME).stream() + .collect(Collectors.joining("/")); + } + + public String web3_sha3(String data) { + byte[] result = Hash.sha3(ByteArray.fromHexString(data)); + return ByteArray.toJsonHex(result); + } } \ No newline at end of file From 9d4c10ab32c811409b1591a40ac95473ae295bb8 Mon Sep 17 00:00:00 2001 From: "federico.zhen" Date: Fri, 28 May 2021 12:33:49 +0800 Subject: [PATCH 006/341] feat: add eth_coinbase, eth_gasPrice and eth_estimateGas --- .../core/services/jsonrpc/TestService.java | 16 ++- .../services/jsonrpc/TestServiceImpl.java | 98 ++++++++++++++++++- 2 files changed, 112 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java index 50cd8b69cca..5816676e270 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java @@ -2,6 +2,7 @@ import com.googlecode.jsonrpc4j.JsonRpcMethod; import org.springframework.stereotype.Component; +import org.tron.core.exception.TronException; @Component public interface TestService { @@ -23,4 +24,17 @@ public interface TestService { @JsonRpcMethod("eth_protocolVersion") int getProtocolVersion(); -} \ No newline at end of file + + @JsonRpcMethod("eth_syncing") + Object isSyncing(); + + @JsonRpcMethod("eth_coinbase") + String getCoinbase() throws Exception; + + @JsonRpcMethod("eth_gasPrice") + String gasPrice(); + + @JsonRpcMethod("eth_estimateGas") + String estimateGas(); + +} diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java index 07f9871d721..e7a07374ba2 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java @@ -1,11 +1,18 @@ package org.tron.core.services.jsonrpc; +import com.google.protobuf.ByteString; +import java.math.BigInteger; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; +import org.junit.Assert; import org.tron.common.crypto.Hash; import org.tron.common.utils.ByteArray; +import org.tron.common.utils.Commons; +import org.tron.common.utils.StringUtil; +import org.tron.core.exception.TronException; import org.tron.program.Version; import org.tron.core.Wallet; @@ -64,4 +71,93 @@ public int getProtocolVersion() { //当前块的版本号。实际是与代码版本对应的。 return wallet.getNowBlock().getBlockHeader().getRawData().getVersion(); } -} \ No newline at end of file + + @Override + public Object isSyncing() { + return true; + } + + @Override + public String getCoinbase() throws Exception { + byte[] tronAddress = wallet.getNowBlock().getBlockHeader().getRawData().getWitnessAddress() + .toByteArray(); + return tronToEthAddress(StringUtil.encode58Check(tronAddress)); + } + + // transform the Tron address to Ethereum Address + private String tronToEthAddress(String tronAddress) throws Exception { + byte[] tronBytes = Commons.decodeFromBase58Check(tronAddress); + byte[] ethBytes = new byte[20]; + + if ((tronBytes.length != 21 && tronBytes[0] != Wallet.getAddressPreFixByte())) { + throw new TronException("invalid Tron address"); + } + System.arraycopy(tronBytes, 1, ethBytes,0, 20); + return toChecksumAddress(ByteArray.toHexString(ethBytes)); + } + + // transform the Ethereum address to Tron Address + private String ethToTronAddress(String ethAddress) throws TronException { + byte[] address = ByteArray.fromHexString(ethAddress); + byte[] tronAddress = new byte[21]; + + if (address.length != 20) { + throw new TronException("invalid Ethereum address"); + } + System.arraycopy(address, 0, tronAddress, 1, 20); + tronAddress[0] = Wallet.getAddressPreFixByte(); + return StringUtil.encode58Check(tronAddress); + } + + private String toChecksumAddress(String address) throws TronException { + StringBuffer sb = new StringBuffer(); + int nibble; + + if (address.startsWith("0x")) { + address = address.substring(2); + } + String hashedAddress = ByteArray + .toHexString(Hash.sha3(address.getBytes(StandardCharsets.UTF_8))); + sb.append("0x"); + for (int i = 0; i < address.length(); i++) { + if ("0123456789".contains(String.valueOf(address.charAt(i)))) { + sb.append(address.charAt(i)); + } else if ("abcdef".contains(String.valueOf(address.charAt(i)))) { + nibble = Integer.parseInt(String.valueOf(hashedAddress.charAt(i)), 16); + if (nibble > 7) { + sb.append(String.valueOf(address.charAt(i)).toUpperCase()); + } else { + sb.append(address.charAt(i)); + } + } else { + throw new TronException("invalid hex character in address"); + } + } + return sb.toString(); + } + + @Override + public String gasPrice() { + BigInteger gasPrice; + BigInteger multiplier = new BigInteger("1000000000", 10); // Gwei: 10^9 + + if ("getTransactionFee".equals(wallet.getChainParameters().getChainParameter(3).getKey())) { + gasPrice = BigInteger.valueOf(wallet.getChainParameters().getChainParameter(3).getValue()); + } else { + gasPrice = BigInteger.valueOf(140); + } + return "0x" + gasPrice.multiply(multiplier).toString(16); + } + + @Override + public String estimateGas() { + BigInteger feeLimit = BigInteger.valueOf(100); + BigInteger precision = new BigInteger("1000000000000000000"); // 1ether = 10^18 wei + BigInteger gasPrice = new BigInteger(gasPrice().substring(2), 16); + if (gasPrice.compareTo(BigInteger.ZERO) > 0) { + return "0x" + feeLimit.multiply(precision).divide(gasPrice).toString(16); + } else { + return "0x0"; + } + } +} From 5a5f3af93d0d09eca58a20d449d30d1fa6d5e062 Mon Sep 17 00:00:00 2001 From: "federico.zhen" Date: Fri, 28 May 2021 15:11:24 +0800 Subject: [PATCH 007/341] feat: add eth_coinbase, eth_gasPrice and eth_estimateGas --- .../core/services/jsonrpc/TestService.java | 15 ++- .../services/jsonrpc/TestServiceImpl.java | 108 +++++++++++++++++- 2 files changed, 119 insertions(+), 4 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java index 50cd8b69cca..ca121766b50 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java @@ -23,4 +23,17 @@ public interface TestService { @JsonRpcMethod("eth_protocolVersion") int getProtocolVersion(); -} \ No newline at end of file + + @JsonRpcMethod("eth_syncing") + Object isSyncing(); + + @JsonRpcMethod("eth_coinbase") + String getCoinbase(); + + @JsonRpcMethod("eth_gasPrice") + String gasPrice(); + + @JsonRpcMethod("eth_estimateGas") + String estimateGas(); + +} diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java index 07f9871d721..6605d50d42a 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java @@ -1,15 +1,19 @@ package org.tron.core.services.jsonrpc; +import java.math.BigInteger; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; import org.tron.common.crypto.Hash; import org.tron.common.utils.ByteArray; -import org.tron.program.Version; - +import org.tron.common.utils.Commons; +import org.tron.common.utils.StringUtil; import org.tron.core.Wallet; +import org.tron.core.exception.TronException; import org.tron.core.services.NodeInfoService; +import org.tron.program.Version; public class TestServiceImpl implements TestService { @@ -64,4 +68,102 @@ public int getProtocolVersion() { //当前块的版本号。实际是与代码版本对应的。 return wallet.getNowBlock().getBlockHeader().getRawData().getVersion(); } -} \ No newline at end of file + + @Override + public Object isSyncing() { + return true; + } + + @Override + public String getCoinbase() { + byte[] tronAddress = wallet.getNowBlock().getBlockHeader().getRawData().getWitnessAddress() + .toByteArray(); + return tronToEthAddress(StringUtil.encode58Check(tronAddress)); + } + + // transform the Tron address to Ethereum Address + private String tronToEthAddress(String tronAddress) { + byte[] tronBytes = Commons.decodeFromBase58Check(tronAddress); + byte[] ethBytes = new byte[20]; + try { + if ((tronBytes.length != 21 && tronBytes[0] != Wallet.getAddressPreFixByte())) { + throw new TronException("invalid Tron address"); + } + System.arraycopy(tronBytes, 1, ethBytes, 0, 20); + return toChecksumAddress(ByteArray.toHexString(ethBytes)); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + // transform the Ethereum address to Tron Address + private String ethToTronAddress(String ethAddress) { + byte[] address = ByteArray.fromHexString(ethAddress); + byte[] tronAddress = new byte[21]; + try { + if (address.length != 20) { + throw new TronException("invalid Ethereum address"); + } + System.arraycopy(address, 0, tronAddress, 1, 20); + tronAddress[0] = Wallet.getAddressPreFixByte(); + return StringUtil.encode58Check(tronAddress); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + //reference: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-55.md + private String toChecksumAddress(String address) throws TronException { + StringBuffer sb = new StringBuffer(); + int nibble; + + if (address.startsWith("0x")) { + address = address.substring(2); + } + String hashedAddress = ByteArray + .toHexString(Hash.sha3(address.getBytes(StandardCharsets.UTF_8))); + sb.append("0x"); + for (int i = 0; i < address.length(); i++) { + if ("0123456789".contains(String.valueOf(address.charAt(i)))) { + sb.append(address.charAt(i)); + } else if ("abcdef".contains(String.valueOf(address.charAt(i)))) { + nibble = Integer.parseInt(String.valueOf(hashedAddress.charAt(i)), 16); + if (nibble > 7) { + sb.append(String.valueOf(address.charAt(i)).toUpperCase()); + } else { + sb.append(address.charAt(i)); + } + } else { + throw new TronException("invalid hex character in address"); + } + } + return sb.toString(); + } + + @Override + public String gasPrice() { + BigInteger gasPrice; + BigInteger multiplier = new BigInteger("1000000000", 10); // Gwei: 10^9 + + if ("getTransactionFee".equals(wallet.getChainParameters().getChainParameter(3).getKey())) { + gasPrice = BigInteger.valueOf(wallet.getChainParameters().getChainParameter(3).getValue()); + } else { + gasPrice = BigInteger.valueOf(140); + } + return "0x" + gasPrice.multiply(multiplier).toString(16); + } + + @Override + public String estimateGas() { + BigInteger feeLimit = BigInteger.valueOf(100); // set fee limit: 100 trx + BigInteger precision = new BigInteger("1000000000000000000"); // 1ether = 10^18 wei + BigInteger gasPrice = new BigInteger(gasPrice().substring(2), 16); + if (gasPrice.compareTo(BigInteger.ZERO) > 0) { + return "0x" + feeLimit.multiply(precision).divide(gasPrice).toString(16); + } else { + return "0x0"; + } + } +} From 6b1bfe9e98a351b9e254f1ab681e377c74fa0de8 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Fri, 28 May 2021 15:46:24 +0800 Subject: [PATCH 008/341] add five rpc api --- .../core/services/jsonrpc/TestService.java | 17 ++ .../services/jsonrpc/TestServiceImpl.java | 172 +++++++++++++++++- 2 files changed, 188 insertions(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java index 96b56e7c617..b1c9111d061 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java @@ -1,7 +1,9 @@ package org.tron.core.services.jsonrpc; import com.googlecode.jsonrpc4j.JsonRpcMethod; +import java.math.BigInteger; import org.springframework.stereotype.Component; +import org.tron.core.exception.ItemNotFoundException; @Component public interface TestService { @@ -17,4 +19,19 @@ public interface TestService { @JsonRpcMethod("eth_protocolVersion") int getProtocolVersion(); + + @JsonRpcMethod("eth_blockNumber") + int getLatestBlockNum(); + + @JsonRpcMethod("eth_getBalance") + long getTrxBalance(String address, String blockNumOrTag) throws ItemNotFoundException; + + @JsonRpcMethod("eth_getStorageAt") + BigInteger getTrc20Balance(String address, String contractAddress, String blockNumOrTag); + + @JsonRpcMethod("eth_getTransactionCount") + int getSendTransactionCountOfAddress(String address, String blockNumOrTag); + + @JsonRpcMethod("eth_getCode") + String getABIofSmartContract(String contractAddress); } \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java index b17bb2a51fc..63d2691554e 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java @@ -1,10 +1,38 @@ package org.tron.core.services.jsonrpc; -import org.springframework.beans.factory.annotation.Autowired; +import static org.tron.common.utils.Commons.decode58Check; +import static org.tron.common.utils.DecodeUtil.addressValid; +import static org.tron.core.Wallet.CONTRACT_VALIDATE_ERROR; +import static org.tron.core.Wallet.CONTRACT_VALIDATE_EXCEPTION; + +import com.google.protobuf.ByteString; +import java.math.BigInteger; +import java.util.List; +import java.util.Objects; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.spongycastle.util.encoders.Hex; import org.springframework.stereotype.Component; +import org.tron.api.GrpcAPI.BytesMessage; +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.common.utils.ByteUtil; import org.tron.core.Wallet; +import org.tron.core.capsule.TransactionCapsule; +import org.tron.core.exception.ContractValidateException; +import org.tron.core.exception.ItemNotFoundException; +import org.tron.core.exception.VMIllegalException; import org.tron.core.services.NodeInfoService; +import org.tron.protos.Protocol.Account; +import org.tron.protos.Protocol.Transaction; +import org.tron.protos.Protocol.Transaction.Contract.ContractType; +import org.tron.protos.contract.SmartContractOuterClass.SmartContract; +import org.tron.protos.contract.SmartContractOuterClass.TriggerSmartContract; +@Slf4j(topic = "API") @Component public class TestServiceImpl implements TestService { @@ -41,4 +69,146 @@ public int getProtocolVersion() { //当前块的版本号。实际是与代码版本对应的。 return wallet.getNowBlock().getBlockHeader().getRawData().getVersion(); } + + @Override + public int getLatestBlockNum() { + //当前节点同步的最新块号 + return (int) wallet.getNowBlock().getBlockHeader().getRawData().getNumber(); + } + + @Override + public long getTrxBalance(String address, String blockNumOrTag) throws ItemNotFoundException { + //某个用户的trx余额,以sun为单位 + byte[] addressData = decodeFromBase58Check(address); + Account account = Account.newBuilder().setAddress(ByteString.copyFrom(addressData)).build(); + return wallet.getAccount(account).getBalance(); + } + + private String getMethodSign(String method) { + byte[] selector = new byte[4]; + System.arraycopy(Hash.sha3(method.getBytes()), 0, selector, 0, 4); + return Hex.toHexString(selector); + } + + public byte[] decodeFromBase58Check(String addressBase58) { + if (StringUtils.isEmpty(addressBase58)) { + // logger.warn("Warning: Address is empty !!"); + return null; + } + + byte[] address; + try { + address = decode58Check(addressBase58); + if (!addressValid(address)) { + return null; + } + } catch (Exception e) { + // logger.warn("decodeFromBase58Check exception, address is " + addressBase58); + return null; + } + + return address; + } + + public TriggerSmartContract triggerCallContract(byte[] address, byte[] contractAddress, + long callValue, byte[] data, long tokenValue, String tokenId) { + TriggerSmartContract.Builder builder = TriggerSmartContract.newBuilder(); + builder.setOwnerAddress(ByteString.copyFrom(address)); + builder.setContractAddress(ByteString.copyFrom(contractAddress)); + builder.setData(ByteString.copyFrom(data)); + builder.setCallValue(callValue); + if (tokenId != null && tokenId != "") { + builder.setCallTokenValue(tokenValue); + builder.setTokenId(Long.parseLong(tokenId)); + } + return builder.build(); + } + + @Override + public BigInteger getTrc20Balance(String ownerAddress, String contractAddress, + String blockNumOrTag) { + //某个用户拥有的某个token20余额,带精度 + byte[] addressData = decodeFromBase58Check(ownerAddress); + byte[] addressDataWord = new byte[32]; + System.arraycopy(addressData, 0, addressDataWord, 32 - addressData.length, addressData.length); + String dataStr = getMethodSign("balanceOf(address)") + Hex.toHexString(addressDataWord); + + //构造静态合约时,只需要3个字段 + TriggerSmartContract triggerContract = triggerCallContract(addressData, + decodeFromBase58Check(contractAddress), 0, + ByteArray.fromHexString(dataStr), 0, null); + + TransactionExtention.Builder trxExtBuilder = TransactionExtention.newBuilder(); + Return.Builder retBuilder = Return.newBuilder(); + TransactionExtention trxExt; + + try { + TransactionCapsule trxCap = wallet.createTransactionCapsule(triggerContract, + ContractType.TriggerSmartContract); + Transaction trx = wallet.triggerConstantContract( + triggerContract, + trxCap, + trxExtBuilder, + retBuilder); + + retBuilder.setResult(true).setCode(response_code.SUCCESS); + trxExtBuilder.setTransaction(trx); + trxExtBuilder.setTxid(trxCap.getTransactionId().getByteString()); + trxExtBuilder.setResult(retBuilder); + } catch (ContractValidateException | VMIllegalException e) { + retBuilder.setResult(false).setCode(response_code.CONTRACT_VALIDATE_ERROR) + .setMessage(ByteString.copyFromUtf8(CONTRACT_VALIDATE_ERROR + e.getMessage())); + trxExtBuilder.setResult(retBuilder); + logger.warn(CONTRACT_VALIDATE_EXCEPTION, e.getMessage()); + } catch (RuntimeException e) { + retBuilder.setResult(false).setCode(response_code.CONTRACT_EXE_ERROR) + .setMessage(ByteString.copyFromUtf8(e.getClass() + " : " + e.getMessage())); + trxExtBuilder.setResult(retBuilder); + logger.warn("When run constant call in VM, have RuntimeException: " + e.getMessage()); + } catch (Exception e) { + retBuilder.setResult(false).setCode(response_code.OTHER_ERROR) + .setMessage(ByteString.copyFromUtf8(e.getClass() + " : " + e.getMessage())); + trxExtBuilder.setResult(retBuilder); + logger.warn("Unknown exception caught: " + e.getMessage(), e); + } finally { + trxExt = trxExtBuilder.build(); + } + + String result = null; + String code = trxExt.getResult().getCode().toString(); + if ("SUCCESS".equals(code)) { + List list = trxExt.getConstantResultList(); + byte[] listBytes = new byte[0]; + for (ByteString bs : list) { + listBytes = ByteUtil.merge(listBytes, bs.toByteArray()); + } + result = Hex.toHexString(listBytes); + } else { + logger.error("trigger contract to get scaling factor error."); + } + + if (Objects.isNull(result)) { + return BigInteger.valueOf(0); + } + if (result.length() > 64) { + result = result.substring(0, 64); + } + return new BigInteger(1, ByteArray.fromHexString(result)); + } + + @Override + public int getSendTransactionCountOfAddress(String address, String blockNumOrTag) { + //发起人为某个地址的交易总数。FullNode无法实现该功能 + return -1; + } + + @Override + public String getABIofSmartContract(String contractAddress) { + //获取某个合约地址的字节码 + byte[] addressData = decodeFromBase58Check(contractAddress); + BytesMessage.Builder build = BytesMessage.newBuilder(); + BytesMessage bytesMessage = build.setValue(ByteString.copyFrom(addressData)).build(); + SmartContract smartContract = wallet.getContract(bytesMessage); + return ByteArray.toHexString(smartContract.getBytecode().toByteArray()); + } } \ No newline at end of file From 540284717fcd17b1940f763bc76af4c47d3edc11 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Fri, 28 May 2021 17:58:27 +0800 Subject: [PATCH 009/341] feat: add eth_getBlockTransactionCountByHash and eth_getBlockTransactionCountByNumber --- .../java/org/tron/common/utils/ByteArray.java | 30 +++++++++++++------ .../src/main/java/org/tron/core/Wallet.java | 23 ++++++++++++++ .../core/services/jsonrpc/TestService.java | 6 ++++ .../services/jsonrpc/TestServiceImpl.java | 20 +++++++++++++ 4 files changed, 70 insertions(+), 9 deletions(-) diff --git a/common/src/main/java/org/tron/common/utils/ByteArray.java b/common/src/main/java/org/tron/common/utils/ByteArray.java index 5a2e669b3dc..b3426f6416c 100644 --- a/common/src/main/java/org/tron/common/utils/ByteArray.java +++ b/common/src/main/java/org/tron/common/utils/ByteArray.java @@ -116,15 +116,27 @@ public static String toJsonHex(byte[] x) { return x == null || x.length == 0 ? null : "0x" + Hex.toHexString(x); } - /** - * Generate a subarray of a given byte array. - * - * @param input the input byte array - * @param start the start index - * @param end the end index - * @return a subarray of input, ranging from start (inclusively) to end - * (exclusively) - */ + public static String toJsonHex(Long x) { + return x == null ? null : "0x" + Long.toHexString(x); + } + + public static BigInteger hexToBigInteger(String input) { + if (input.startsWith("0x")) { + return new BigInteger(input.substring(2), 16); + } else { + return new BigInteger(input, 10); + } + } + + /** + * Generate a subarray of a given byte array. + * + * @param input the input byte array + * @param start the start index + * @param end the end index + * @return a subarray of input, ranging from start (inclusively) to end + * (exclusively) + */ public static byte[] subArray(byte[] input, int start, int end) { byte[] result = new byte[end - start]; System.arraycopy(input, start, result, 0, end - start); diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index 10306b5fa85..cf4aab85d80 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -662,6 +662,29 @@ public long getTransactionCountByBlockNum(long blockNum) { return count; } + public Block getByJsonBlockId(String id) { + if ("earliest".equalsIgnoreCase(id)) { + return getBlockByNum(0); + } else if ("latest".equalsIgnoreCase(id)) { + return getNowBlock(); + } else if ("pending".equalsIgnoreCase(id)) { + return null; + } else { + long blockNumber = ByteArray.hexToBigInteger(id).longValue(); + return getBlockByNum(blockNumber); + } + } + + public List getTransactionsByJsonBlockId(String id) { + if ("pending".equalsIgnoreCase(id)) { + // todo + return null; + } else { + Block block = getByJsonBlockId(id); + return block != null ? block.getTransactionsList() : null; + } + } + public WitnessList getWitnessList() { WitnessList.Builder builder = WitnessList.newBuilder(); List witnessCapsuleList = chainBaseManager.getWitnessStore().getAllWitnesses(); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java index 5816676e270..1554080e320 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java @@ -16,6 +16,12 @@ public interface TestService { @JsonRpcMethod("web3_sha3") String web3Sha3(String data) throws Exception; + @JsonRpcMethod("eth_getBlockTransactionCountByHash") + String ethGetBlockTransactionCountByHash(String blockHash) throws Exception; + + @JsonRpcMethod("eth_getBlockTransactionCountByNumber") + String ethGetBlockTransactionCountByNumber(String bnOrId) throws Exception; + @JsonRpcMethod("net_version") int getNetVersion(); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java index e7a07374ba2..966093d80cd 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java @@ -4,6 +4,7 @@ import java.math.BigInteger; import java.nio.charset.StandardCharsets; import java.util.Arrays; +import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -12,11 +13,14 @@ import org.tron.common.utils.ByteArray; import org.tron.common.utils.Commons; import org.tron.common.utils.StringUtil; +import org.tron.core.exception.StoreException; import org.tron.core.exception.TronException; import org.tron.program.Version; import org.tron.core.Wallet; import org.tron.core.services.NodeInfoService; +import org.tron.protos.Protocol.Block; +import org.tron.protos.Protocol.Transaction; public class TestServiceImpl implements TestService { @@ -54,6 +58,22 @@ public String web3Sha3(String data) { return ByteArray.toJsonHex(result); } + public String ethGetBlockTransactionCountByHash(String blockHash) throws Exception { + Block b = wallet.getBlockById(ByteString.copyFrom(ByteArray.fromHexString(blockHash))); + if (b == null) return null; + + long n = b.getTransactionsList().size(); + return ByteArray.toJsonHex(n); + } + + public String ethGetBlockTransactionCountByNumber(String bnOrId) throws Exception { + List list = wallet.getTransactionsByJsonBlockId(bnOrId); + if (list == null) return null; + + long n = list.size(); + return ByteArray.toJsonHex(n); + } + @Override public int getNetVersion() { //当前链的id,不能跟metamask已有的id冲突 From 5665b67b2031d2561cb42bffb06b59f5b4165075 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Mon, 31 May 2021 10:57:28 +0800 Subject: [PATCH 010/341] add rpc api --- .../tron/core/services/jsonrpc/TestService.java | 9 +++++++++ .../core/services/jsonrpc/TestServiceImpl.java | 16 ++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java index 8b7ec92a8f8..a66afe973ac 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java @@ -52,4 +52,13 @@ public interface TestService { @JsonRpcMethod("eth_estimateGas") String estimateGas(); + + @JsonRpcMethod("eth_getCompilers") + String[] getCompilers(); + + @JsonRpcMethod("eth_compileSolidity") + String compileSolidity(String source); + + @JsonRpcMethod("eth_gettransactionreceipt") + String getTransactionReceipt(String source); } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java index 9af4ec0b406..3e4c931b088 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java @@ -231,4 +231,20 @@ public String estimateGas() { return "0x0"; } } + + @Override + public String[] getCompilers() { + return new String[]{"solidity"}; + } + + @Override + public String compileSolidity(String source) { + //耗费cpu太高,采用trongrid中心化服务器实现。 + return null; + } + + @Override + public String getTransactionReceipt(String source) { + return null; + } } From a646318877afbddba1de8287d76efbea6e7e76cd Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Tue, 1 Jun 2021 14:46:37 +0800 Subject: [PATCH 011/341] add rpc api getTransactionReceipt --- .../core/services/jsonrpc/JsonRpcApiUtil.java | 489 ++++++++++++++++++ .../core/services/jsonrpc/TestService.java | 14 +- .../services/jsonrpc/TestServiceImpl.java | 189 ++++++- 3 files changed, 681 insertions(+), 11 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index ec4f7dd6737..ff6863b3c89 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -1,16 +1,66 @@ package org.tron.core.services.jsonrpc; +import com.google.common.base.Throwables; +import com.google.common.primitives.Longs; +import com.google.protobuf.Any; import com.google.protobuf.ByteString; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Optional; +import lombok.extern.slf4j.Slf4j; import org.spongycastle.util.encoders.Hex; +import org.tron.api.GrpcAPI.AssetIssueList; import org.tron.common.crypto.Hash; import org.tron.common.utils.ByteArray; import org.tron.common.utils.Commons; +import org.tron.common.utils.Sha256Hash; import org.tron.common.utils.StringUtil; import org.tron.core.Wallet; +import org.tron.core.capsule.ContractCapsule; import org.tron.core.exception.TronException; +import org.tron.protos.Protocol.Block; +import org.tron.protos.Protocol.Transaction; +import org.tron.protos.Protocol.Transaction.Contract.ContractType; +import org.tron.protos.Protocol.TransactionInfo; +import org.tron.protos.contract.AccountContract.AccountCreateContract; +import org.tron.protos.contract.AccountContract.AccountPermissionUpdateContract; +import org.tron.protos.contract.AccountContract.AccountUpdateContract; +import org.tron.protos.contract.AccountContract.SetAccountIdContract; +import org.tron.protos.contract.AssetIssueContractOuterClass.AssetIssueContract; +import org.tron.protos.contract.AssetIssueContractOuterClass.AssetIssueContract.FrozenSupply; +import org.tron.protos.contract.AssetIssueContractOuterClass.ParticipateAssetIssueContract; +import org.tron.protos.contract.AssetIssueContractOuterClass.TransferAssetContract; +import org.tron.protos.contract.AssetIssueContractOuterClass.UnfreezeAssetContract; +import org.tron.protos.contract.AssetIssueContractOuterClass.UpdateAssetContract; +import org.tron.protos.contract.BalanceContract.FreezeBalanceContract; +import org.tron.protos.contract.BalanceContract.TransferContract; +import org.tron.protos.contract.BalanceContract.UnfreezeBalanceContract; +import org.tron.protos.contract.BalanceContract.WithdrawBalanceContract; +import org.tron.protos.contract.ExchangeContract.ExchangeCreateContract; +import org.tron.protos.contract.ExchangeContract.ExchangeInjectContract; +import org.tron.protos.contract.ExchangeContract.ExchangeTransactionContract; +import org.tron.protos.contract.ExchangeContract.ExchangeWithdrawContract; +import org.tron.protos.contract.MarketContract.MarketCancelOrderContract; +import org.tron.protos.contract.MarketContract.MarketSellAssetContract; +import org.tron.protos.contract.ProposalContract.ProposalApproveContract; +import org.tron.protos.contract.ProposalContract.ProposalCreateContract; +import org.tron.protos.contract.ProposalContract.ProposalDeleteContract; +import org.tron.protos.contract.ShieldContract.ShieldedTransferContract; +import org.tron.protos.contract.SmartContractOuterClass.ClearABIContract; +import org.tron.protos.contract.SmartContractOuterClass.CreateSmartContract; import org.tron.protos.contract.SmartContractOuterClass.TriggerSmartContract; +import org.tron.protos.contract.SmartContractOuterClass.UpdateEnergyLimitContract; +import org.tron.protos.contract.SmartContractOuterClass.UpdateSettingContract; +import org.tron.protos.contract.StorageContract.UpdateBrokerageContract; +import org.tron.protos.contract.VoteAssetContractOuterClass.VoteAssetContract; +import org.tron.protos.contract.WitnessContract.VoteWitnessContract; +import org.tron.protos.contract.WitnessContract.VoteWitnessContract.Vote; +import org.tron.protos.contract.WitnessContract.WitnessCreateContract; +import org.tron.protos.contract.WitnessContract.WitnessUpdateContract; +@Slf4j(topic = "API") public class JsonRpcApiUtil { // transform the Tron address to Ethereum Address @@ -93,4 +143,443 @@ public static TriggerSmartContract triggerCallContract(byte[] address, byte[] co } return builder.build(); } + + public static String getBlockID(Block block) { + long blockNum = block.getBlockHeader().getRawData().getNumber(); + byte[] blockHash = Sha256Hash.of(true, block.getBlockHeader().getRawData().toByteArray()) + .getByteString().toByteArray(); + byte[] numBytes = Longs.toByteArray(blockNum); + byte[] hash = new byte[blockHash.length]; + System.arraycopy(numBytes, 0, hash, 0, 8); + System.arraycopy(blockHash, 8, hash, 8, blockHash.length - 8); + return "0x" + ByteArray.toHexString(hash); + } + + public static byte[] getOwner(Transaction.Contract contract) { + ByteString owner = null; + try { + Any contractParameter = contract.getParameter(); + switch (contract.getType()) { + case AccountCreateContract: + owner = contractParameter.unpack(AccountCreateContract.class).getOwnerAddress(); + break; + case AccountUpdateContract: + owner = contractParameter.unpack(AccountUpdateContract.class).getOwnerAddress(); + break; + case SetAccountIdContract: + owner = contractParameter.unpack(SetAccountIdContract.class).getOwnerAddress(); + break; + case TransferContract: + owner = contractParameter.unpack(TransferContract.class).getOwnerAddress(); + break; + case TransferAssetContract: + owner = contractParameter.unpack(TransferAssetContract.class).getOwnerAddress(); + break; + case VoteAssetContract: + owner = contractParameter.unpack(VoteAssetContract.class).getOwnerAddress(); + break; + case VoteWitnessContract: + owner = contractParameter.unpack(VoteWitnessContract.class).getOwnerAddress(); + break; + case WitnessCreateContract: + owner = contractParameter.unpack(WitnessCreateContract.class).getOwnerAddress(); + break; + case AssetIssueContract: + owner = contractParameter.unpack(AssetIssueContract.class).getOwnerAddress(); + break; + case WitnessUpdateContract: + owner = contractParameter.unpack(WitnessUpdateContract.class).getOwnerAddress(); + break; + case ParticipateAssetIssueContract: + owner = contractParameter.unpack(ParticipateAssetIssueContract.class).getOwnerAddress(); + break; + case FreezeBalanceContract: + owner = contractParameter.unpack(FreezeBalanceContract.class).getOwnerAddress(); + break; + case UnfreezeBalanceContract: + owner = contractParameter.unpack(UnfreezeBalanceContract.class).getOwnerAddress(); + break; + case UnfreezeAssetContract: + owner = contractParameter.unpack(UnfreezeAssetContract.class).getOwnerAddress(); + break; + case WithdrawBalanceContract: + owner = contractParameter.unpack(WithdrawBalanceContract.class).getOwnerAddress(); + break; + case CreateSmartContract: + owner = contractParameter.unpack(CreateSmartContract.class).getOwnerAddress(); + break; + case TriggerSmartContract: + owner = contractParameter.unpack(TriggerSmartContract.class).getOwnerAddress(); + break; + case UpdateAssetContract: + owner = contractParameter.unpack(UpdateAssetContract.class).getOwnerAddress(); + break; + case ProposalCreateContract: + owner = contractParameter.unpack(ProposalCreateContract.class).getOwnerAddress(); + break; + case ProposalApproveContract: + owner = contractParameter.unpack(ProposalApproveContract.class).getOwnerAddress(); + break; + case ProposalDeleteContract: + owner = contractParameter.unpack(ProposalDeleteContract.class).getOwnerAddress(); + break; +// case BuyStorageContract: +// owner = contractParameter.unpack(BuyStorageContract.class).getOwnerAddress(); +// break; +// case BuyStorageBytesContract: +// owner = contractParameter.unpack(BuyStorageBytesContract.class).getOwnerAddress(); +// break; +// case SellStorageContract: +// owner = contractParameter.unpack(SellStorageContract.class).getOwnerAddress(); +// break; + case UpdateSettingContract: + owner = contractParameter.unpack(UpdateSettingContract.class) + .getOwnerAddress(); + break; + case ExchangeCreateContract: + owner = contractParameter.unpack(ExchangeCreateContract.class).getOwnerAddress(); + break; + case ExchangeInjectContract: + owner = contractParameter.unpack(ExchangeInjectContract.class).getOwnerAddress(); + break; + case ExchangeWithdrawContract: + owner = contractParameter.unpack(ExchangeWithdrawContract.class).getOwnerAddress(); + break; + case ExchangeTransactionContract: + owner = contractParameter.unpack(ExchangeTransactionContract.class).getOwnerAddress(); + break; + case UpdateEnergyLimitContract: + owner = contractParameter.unpack(UpdateEnergyLimitContract.class).getOwnerAddress(); + break; + case AccountPermissionUpdateContract: + owner = contractParameter.unpack(AccountPermissionUpdateContract.class).getOwnerAddress(); + break; + case ClearABIContract: + owner = contractParameter.unpack(ClearABIContract.class).getOwnerAddress(); + break; + case UpdateBrokerageContract: + owner = contractParameter.unpack(UpdateBrokerageContract.class) + .getOwnerAddress(); + break; + case ShieldedTransferContract: + owner = contractParameter.unpack(ShieldedTransferContract.class) + .getTransparentFromAddress(); + break; + case MarketSellAssetContract: + owner = contractParameter.unpack(MarketSellAssetContract.class) + .getOwnerAddress(); + break; + case MarketCancelOrderContract: + owner = contractParameter.unpack(MarketCancelOrderContract.class) + .getOwnerAddress(); + break; + default: + return null; + } + return owner.toByteArray(); + } catch (Exception ex) { + ex.printStackTrace(); + } catch (Throwable t) { + //捕获unpack抛出的java.lang.NoClassDefFoundError,否则线程中断。上一个不能捕获 + t.printStackTrace(); + } + + return owner == null ? null : owner.toByteArray(); + } + + public static ArrayList getTo(Transaction transaction) { + Transaction.Contract contract = transaction.getRawData().getContract(0); + ArrayList list = new ArrayList<>(); + try { + Any contractParameter = contract.getParameter(); + switch (contract.getType()) { + case AccountCreateContract: + list.add(contractParameter.unpack(AccountCreateContract.class).getAccountAddress()); + break; + case AccountUpdateContract: + break; + case SetAccountIdContract: + break; + case TransferContract: + list.add(contractParameter.unpack(TransferContract.class).getToAddress()); + break; + case TransferAssetContract: + list.add(contractParameter.unpack(TransferAssetContract.class).getToAddress()); + break; + case VoteAssetContract: + list.addAll(contractParameter.unpack(VoteAssetContract.class).getVoteAddressList()); + break; + case VoteWitnessContract: + for (Vote vote : contractParameter.unpack(VoteWitnessContract.class).getVotesList()) { + list.add(vote.getVoteAddress()); + } + break; + case WitnessCreateContract: + break; + case AssetIssueContract: + break; + case WitnessUpdateContract: + break; + case ParticipateAssetIssueContract: + list.add(contractParameter.unpack(ParticipateAssetIssueContract.class).getToAddress()); + break; + case FreezeBalanceContract: + ByteString receiverAddress = contractParameter.unpack(FreezeBalanceContract.class) + .getReceiverAddress(); + if (receiverAddress != null && !receiverAddress.isEmpty()) { + list.add(receiverAddress); + } + break; + case UnfreezeBalanceContract: + receiverAddress = contractParameter.unpack(UnfreezeBalanceContract.class) + .getReceiverAddress(); + if (receiverAddress != null && !receiverAddress.isEmpty()) { + list.add(receiverAddress); + } + break; + case UnfreezeAssetContract: + break; + case WithdrawBalanceContract: + break; + case CreateSmartContract: + list.add(ByteString.copyFrom(generateContractAddress(transaction))); + break; + case TriggerSmartContract: + list.add(contractParameter.unpack(TriggerSmartContract.class).getContractAddress()); + break; + case UpdateAssetContract: + break; + case ProposalCreateContract: + break; + case ProposalApproveContract: + break; + case ProposalDeleteContract: + break; +// case BuyStorageContract: +// owner = contractParameter.unpack(BuyStorageContract.class).getOwnerAddress(); +// break; +// case BuyStorageBytesContract: +// owner = contractParameter.unpack(BuyStorageBytesContract.class).getOwnerAddress(); +// break; +// case SellStorageContract: +// owner = contractParameter.unpack(SellStorageContract.class).getOwnerAddress(); +// break; + case UpdateSettingContract: + list.add(contractParameter.unpack(UpdateSettingContract.class).getContractAddress()); + break; + case ExchangeCreateContract: + break; + case ExchangeInjectContract: + break; + case ExchangeWithdrawContract: + break; + case ExchangeTransactionContract: + break; + case UpdateEnergyLimitContract: + list.add(contractParameter.unpack(UpdateEnergyLimitContract.class).getContractAddress()); + break; + case AccountPermissionUpdateContract: + break; + case ClearABIContract: + list.add(contractParameter.unpack(ClearABIContract.class).getContractAddress()); + break; + case UpdateBrokerageContract: + break; + case ShieldedTransferContract: + ShieldedTransferContract shieldedTransferContract = contract.getParameter() + .unpack(ShieldedTransferContract.class); + if (!shieldedTransferContract.getTransparentToAddress().isEmpty()) { + list.add(shieldedTransferContract.getTransparentToAddress()); + } + break; + default: + break; + } + return list; + } catch (Exception ex) { + ex.printStackTrace(); + } catch (Throwable t) { + t.printStackTrace(); + } + return list; + } + + public static byte[] generateContractAddress(Transaction trx) { + + CreateSmartContract contract = ContractCapsule.getSmartContractFromTransaction(trx); + byte[] ownerAddress = contract.getOwnerAddress().toByteArray(); + + byte[] txRawDataHash = Sha256Hash.hash(true, trx.getRawData().toByteArray()); + + byte[] combined = new byte[txRawDataHash.length + ownerAddress.length]; + System.arraycopy(txRawDataHash, 0, combined, 0, txRawDataHash.length); + System.arraycopy(ownerAddress, 0, combined, txRawDataHash.length, ownerAddress.length); + + return Hash.sha3omit12(combined); + } + + public static String getTxID(Transaction transaction) { + return ByteArray.toHexString(Sha256Hash.hash(true, transaction.getRawData().toByteArray())); + } + + /** + * 获取交易的 amount + */ + public static long getTransactionAmount(Transaction.Contract contract, String hash, + long blockNum, TransactionInfo transactionInfo, Wallet wallet) { + long amount = 0; + try { + Any contractParameter = contract.getParameter(); + switch (contract.getType()) { + case TransferContract: + amount = contractParameter.unpack(TransferContract.class).getAmount(); + break; + case TransferAssetContract: + amount = contractParameter.unpack(TransferAssetContract.class).getAmount(); + break; + case VoteWitnessContract: + List votesList = contractParameter.unpack(VoteWitnessContract.class).getVotesList(); + long voteNumber = 0L; + for (Vote vote : votesList) { + voteNumber += vote.getVoteCount(); + } + amount = voteNumber; + break; + case WitnessCreateContract: + amount = 9999_000_000L; + break; + case AssetIssueContract: + case ExchangeCreateContract: + amount = 1024_000_000L; + break; + case ParticipateAssetIssueContract: +// long token = DataImporter.getTokenID(blockNum, +// contractParameter.unpack(ParticipateAssetIssueContract.class).getAssetName()); +// //获取token的比例,计算出10币的数量 +// long trxNum = contractParameter.unpack(ParticipateAssetIssueContract.class).getAmount(); +// Token10Entity entity = DataImporter.getTokenEntity(token); +// long exchangeAmount = Math.multiplyExact(trxNum, entity.getNum()); +// exchangeAmount = Math.floorDiv(exchangeAmount, entity.getTrxNum()); +// amount = exchangeAmount; + break; + case FreezeBalanceContract: + amount = contractParameter.unpack(FreezeBalanceContract.class).getFrozenBalance(); + break; + case TriggerSmartContract: + amount = contractParameter.unpack(TriggerSmartContract.class).getCallValue(); + break; + case ExchangeInjectContract: + amount = contractParameter.unpack(ExchangeInjectContract.class).getQuant(); + break; + case ExchangeWithdrawContract: + amount = contractParameter.unpack(ExchangeWithdrawContract.class).getQuant(); + break; + case ExchangeTransactionContract: + amount = contractParameter.unpack(ExchangeTransactionContract.class).getQuant(); + break; + case AccountPermissionUpdateContract: + amount = 100_000_000L; + break; + case ShieldedTransferContract: + ShieldedTransferContract shieldedTransferContract = contract.getParameter() + .unpack(ShieldedTransferContract.class); + //from_amount 和 to_amount 不可能同时大于0 + if (shieldedTransferContract.getFromAmount() > 0L) { + amount = shieldedTransferContract.getFromAmount(); + } else if (shieldedTransferContract.getToAmount() > 0L) { + amount = shieldedTransferContract.getToAmount(); + } + break; + case UnfreezeBalanceContract: + case WithdrawBalanceContract: + amount = getAmountFromTransactionInfo(hash, contract.getType(), transactionInfo); + break; + case UnfreezeAssetContract: + amount = getUnfreezeAssetAmount(contractParameter.unpack(UnfreezeAssetContract.class) + .getOwnerAddress().toByteArray(), wallet); + break; + default: + } + } catch (Exception e) { + logger.error("Exception happens when get amount. Exception = [{}]", + Throwables.getStackTraceAsString(e)); + } catch (Throwable t) { + t.printStackTrace(); + } + return amount; + } + + public static long getAmountFromTransactionInfo(String hash, ContractType contractType, + TransactionInfo transactionInfo) { + long amount = 0L; + try { + + if (transactionInfo != null) { + + switch (contractType) { + case UnfreezeBalanceContract: + amount = transactionInfo.getUnfreezeAmount(); + break; + case WithdrawBalanceContract: + amount = transactionInfo.getWithdrawAmount(); + break; + case ExchangeInjectContract: + amount = transactionInfo.getExchangeInjectAnotherAmount(); + break; + case ExchangeWithdrawContract: + amount = transactionInfo.getExchangeWithdrawAnotherAmount(); + break; + case ExchangeTransactionContract: + amount = transactionInfo.getExchangeReceivedAmount(); + break; + default: + break; + } + } else { + logger.error("Can't find transaction {} ", hash); + } + } catch (Exception e) { + logger.warn("Exception happens when get amount from transactionInfo. Exception = [{}]", + Throwables.getStackTraceAsString(e)); + } catch (Throwable t) { + t.printStackTrace(); + } + return amount; + } + + public static long getUnfreezeAssetAmount(byte[] addressBytes, Wallet wallet) { + long amount = 0L; + try { + if (addressBytes == null) { + return amount; + } + + AssetIssueList assetIssueList = wallet + .getAssetIssueByAccount(ByteString.copyFrom(addressBytes)); + if (assetIssueList != null) { + if (assetIssueList.getAssetIssueCount() != 1) { + return amount; + } else { + AssetIssueContract assetIssue = assetIssueList.getAssetIssue(0); + Iterator iterator = assetIssue.getFrozenSupplyList().iterator(); + while (iterator.hasNext()) { + FrozenSupply frozenSupply = iterator.next(); + amount += frozenSupply.getFrozenAmount(); + } + } + } + } catch (Exception e) { + logger.warn("Exception happens when get token10 frozenAmount. Exception = [{}]", + Throwables.getStackTraceAsString(e)); + } + return amount; + } + + public static String int2HexString(int i) { + return "0x" + Integer.toHexString(i); + } + + public static String long2HexString(long l) { + return "0x" + Long.toHexString(l); + } } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java index 92bad63209c..c4229e332c6 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java @@ -1,5 +1,6 @@ package org.tron.core.services.jsonrpc; +import com.alibaba.fastjson.JSONObject; import com.googlecode.jsonrpc4j.JsonRpcMethod; import java.math.BigInteger; import org.springframework.stereotype.Component; @@ -43,7 +44,7 @@ public interface TestService { BigInteger getTrc20Balance(String address, String contractAddress, String blockNumOrTag); @JsonRpcMethod("eth_getTransactionCount") - int getSendTransactionCountOfAddress(String address, String blockNumOrTag); + long getSendTransactionCountOfAddress(String address, String blockNumOrTag); @JsonRpcMethod("eth_getCode") String getABIofSmartContract(String contractAddress); @@ -66,6 +67,15 @@ public interface TestService { @JsonRpcMethod("eth_compileSolidity") String compileSolidity(String source); + @JsonRpcMethod("eth_getTransactionByHash") + JSONObject getTransactionByHash(String txid); + + @JsonRpcMethod("eth_getTransactionByBlockHashAndIndex") + JSONObject getTransactionByBlockHashAndIndex(String blockHash, int index); + + @JsonRpcMethod("eth_getTransactionByBlockNumberAndIndex") + JSONObject getTransactionByBlockNumberAndIndex(int blockNum, int index); + @JsonRpcMethod("eth_gettransactionreceipt") - String getTransactionReceipt(String source); + JSONObject getTransactionReceipt(String txid); } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java index 831a8202c51..4d138ff2c80 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java @@ -2,12 +2,24 @@ import static org.tron.core.Wallet.CONTRACT_VALIDATE_ERROR; import static org.tron.core.Wallet.CONTRACT_VALIDATE_EXCEPTION; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.generateContractAddress; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getBlockID; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getMethodSign; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getOwner; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTo; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTransactionAmount; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTxID; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.int2HexString; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.long2HexString; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.triggerCallContract; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.tronToEthAddress; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.google.protobuf.ByteString; +import com.google.protobuf.InvalidProtocolBufferException; import java.math.BigInteger; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; @@ -20,6 +32,7 @@ import org.tron.api.GrpcAPI.Return; import org.tron.api.GrpcAPI.Return.response_code; import org.tron.api.GrpcAPI.TransactionExtention; +import org.tron.api.GrpcAPI.TransactionInfoList; import org.tron.common.crypto.Hash; import org.tron.common.utils.ByteArray; import org.tron.common.utils.ByteUtil; @@ -36,6 +49,8 @@ import org.tron.protos.Protocol.Block; import org.tron.protos.Protocol.Transaction; import org.tron.protos.Protocol.Transaction.Contract.ContractType; +import org.tron.protos.Protocol.TransactionInfo; +import org.tron.protos.contract.SmartContractOuterClass.CreateSmartContract; import org.tron.protos.contract.SmartContractOuterClass.SmartContract; import org.tron.protos.contract.SmartContractOuterClass.TriggerSmartContract; @@ -78,7 +93,9 @@ public String web3Sha3(String data) { public String ethGetBlockTransactionCountByHash(String blockHash) throws Exception { Block b = wallet.getBlockById(ByteString.copyFrom(ByteArray.fromHexString(blockHash))); - if (b == null) return null; + if (b == null) { + return null; + } long n = b.getTransactionsList().size(); return ByteArray.toJsonHex(n); @@ -86,7 +103,9 @@ public String ethGetBlockTransactionCountByHash(String blockHash) throws Excepti public String ethGetBlockTransactionCountByNumber(String bnOrId) throws Exception { List list = wallet.getTransactionsByJsonBlockId(bnOrId); - if (list == null) return null; + if (list == null) { + return null; + } long n = list.size(); return ByteArray.toJsonHex(n); @@ -197,9 +216,9 @@ public BigInteger getTrc20Balance(String ownerAddress, String contractAddress, } @Override - public int getSendTransactionCountOfAddress(String address, String blockNumOrTag) { + public long getSendTransactionCountOfAddress(String address, String blockNumOrTag) { //发起人为某个地址的交易总数。FullNode无法实现该功能 - return -1; + return wallet.getNowBlock().getBlockHeader().getRawData().getTimestamp() + 86400 * 1000; } @Override @@ -219,9 +238,9 @@ public Object isSyncing() { @Override public String getCoinbase() { - byte[] tronAddress = wallet.getNowBlock().getBlockHeader().getRawData().getWitnessAddress() + byte[] witnessAddress = wallet.getNowBlock().getBlockHeader().getRawData().getWitnessAddress() .toByteArray(); - return tronToEthAddress(StringUtil.encode58Check(tronAddress)); + return StringUtil.encode58Check(witnessAddress); } @Override @@ -251,7 +270,7 @@ public String estimateGas() { @Override public String[] getCompilers() { - return new String[]{"solidity"}; + return new String[] {"solidity"}; } @Override @@ -261,7 +280,159 @@ public String compileSolidity(String source) { } @Override - public String getTransactionReceipt(String source) { - return null; + public JSONObject getTransactionByHash(String txid) { + Transaction transaction = wallet + .getTransactionById(ByteString.copyFrom(ByteArray.fromHexString(txid))); + TransactionInfo transactionInfo = wallet + .getTransactionInfoById(ByteString.copyFrom(ByteArray.fromHexString(txid))); + + long blockNum = transactionInfo.getBlockNumber(); + Block block = wallet.getBlockByNum(blockNum); + + return formatRpcTransaction(transaction, transactionInfo, block); + } + + private JSONObject formatRpcTransaction(Transaction transaction, TransactionInfo transactionInfo, + Block block) { + String txid = ByteArray.toHexString(transactionInfo.getId().toByteArray()); + long blockNum = block.getBlockHeader().getRawData().getNumber(); + JSONObject jsonObject = new JSONObject(true); + jsonObject.put("blockHash", getBlockID(block)); + jsonObject.put("blockNumber", long2HexString(blockNum)); + + jsonObject.put("gas", -1); //暂时不填 + jsonObject.put("gasPrice", -1); //暂时不填 + jsonObject.put("hash", txid); + jsonObject.put("input", ""); //暂时不填data字段 + jsonObject.put("nonce", -1); //暂时不写 + byte[] owner = getOwner(transaction.getRawData().getContract(0)); + ArrayList toAddressList = getTo(transaction); + jsonObject.put("from", owner != null ? StringUtil.encode58Check(owner) : null); + jsonObject.put("to", toAddressList.size() > 0 ? + StringUtil.encode58Check(toAddressList.get(0).toByteArray()) : null); + + int transactionIndex = -1; + for (int index = 0; index < block.getTransactionsCount(); index++) { + if (getTxID(block.getTransactions(index)).equals(txid)) { + transactionIndex = index; + break; + } + } + jsonObject.put("transactionIndex", int2HexString(transactionIndex)); + jsonObject.put("value", getTransactionAmount(transaction.getRawData().getContract(0), txid, + blockNum, transactionInfo, wallet)); + + ByteString signature = transaction.getSignature(0); + byte[] signData = signature.toByteArray(); + byte v = (byte) (signData[0] - 27); + byte[] r = Arrays.copyOfRange(signData, 1, 33); + byte[] s = Arrays.copyOfRange(signData, 33, 65); + jsonObject.put("v", "0x" + int2HexString(v)); + jsonObject.put("r", "0x" + ByteArray.toHexString(r)); + jsonObject.put("s", "0x" + ByteArray.toHexString(s)); + + return jsonObject; + } + + @Override + public JSONObject getTransactionByBlockHashAndIndex(String blockHash, int index) { + Block block = wallet.getBlockById(ByteString.copyFrom(ByteArray.fromHexString(blockHash))); + if (block == null) { + return null; + } + if (index > block.getTransactionsCount() - 1) { + return null; + } + Transaction transaction = block.getTransactions(index); + String txid = getTxID(transaction); + TransactionInfo transactionInfo = wallet.getTransactionInfoById( + ByteString.copyFrom(ByteArray.fromHexString(txid))); + + return formatRpcTransaction(transaction, transactionInfo, block); + } + + @Override + public JSONObject getTransactionByBlockNumberAndIndex(int blockNum, int index) { + Block block = wallet.getBlockByNum(blockNum); + if (block == null) { + return null; + } + if (index > block.getTransactionsCount() - 1) { + return null; + } + Transaction transaction = block.getTransactions(index); + String txid = getTxID(transaction); + TransactionInfo transactionInfo = wallet.getTransactionInfoById( + ByteString.copyFrom(ByteArray.fromHexString(txid))); + + return formatRpcTransaction(transaction, transactionInfo, block); + } + + @Override + public JSONObject getTransactionReceipt(String txid) { + + Transaction transaction = wallet + .getTransactionById(ByteString.copyFrom(ByteArray.fromHexString(txid))); + TransactionInfo transactionInfo = wallet + .getTransactionInfoById(ByteString.copyFrom(ByteArray.fromHexString(txid))); + + long blockNum = transactionInfo.getBlockNumber(); + Block block = wallet.getBlockByNum(blockNum); + JSONObject jsonObject = formatRpcTransaction(transaction, transactionInfo, block); + String transactionHash = (String) jsonObject.remove("hash"); + jsonObject.put("transactionHash", transactionHash); + jsonObject.remove("gas"); + jsonObject.remove("gasPrice"); + jsonObject.remove("input"); + jsonObject.remove("nonce"); + jsonObject.remove("value"); + jsonObject.remove("v"); + jsonObject.remove("r"); + jsonObject.remove("s"); + + long cumulativeGasUsed = 0; + TransactionInfoList reply = wallet.getTransactionInfoByBlockNum(blockNum); + for (TransactionInfo info : reply.getTransactionInfoList()) { + cumulativeGasUsed += info.getFee(); + } + jsonObject.put("cumulativeGasUsed", cumulativeGasUsed); + jsonObject.put("gasUsed", transactionInfo.getFee()); + + String contractAddress = null; + Transaction.Contract contract = transaction.getRawData().getContract(0); + if (transaction.getRawData().getContract(0).getType() == ContractType.CreateSmartContract) { + try { + CreateSmartContract createSmartContract = + contract.getParameter().unpack(CreateSmartContract.class); + contractAddress = StringUtil.encode58Check(generateContractAddress(transaction)); + } catch (InvalidProtocolBufferException e) { + e.printStackTrace(); + } + } + jsonObject.put("contractAddress", contractAddress); + + //统一的log + JSONArray logArray = new JSONArray(); + for (int index = 0; index < transactionInfo.getLogCount(); index++) { + TransactionInfo.Log log = transactionInfo.getLogList().get(index); + JSONObject logItem = new JSONObject(true); + logItem.put("logIndex", int2HexString(index + 1)); //log的索引从1开始 + logItem.put("transactionHash", jsonObject.getString("transactionHash")); + logItem.put("transactionIndex", jsonObject.getString("transactionIndex")); + logItem.put("blockHash", jsonObject.getString("blockHash")); + logItem.put("blockNumber", jsonObject.getString("blockNumber")); + logItem.put("address", StringUtil.encode58Check(log.getAddress().toByteArray())); + logItem.put("data", "0x" + ByteArray.toHexString(log.getData().toByteArray())); + String[] topics = new String[log.getTopicsCount()]; + for (int i = 0; i < log.getTopicsCount(); i++) { + topics[i] = "0x" + ByteArray.toHexString(log.getTopics(i).toByteArray()); + } + logItem.put("topics", topics); + logArray.add(logItem); + } + jsonObject.put("logs", logArray); + jsonObject.put("logsBloom", ""); //暂时不填 + + return jsonObject; } } From e383668f69adce189fb2a436ffdd6d722890efb3 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Tue, 1 Jun 2021 16:06:01 +0800 Subject: [PATCH 012/341] modify v,r,s in formatRpcTransaction --- .../core/services/jsonrpc/JsonRpcApiUtil.java | 19 +++++++- .../services/jsonrpc/TestServiceImpl.java | 45 +++++++++---------- 2 files changed, 39 insertions(+), 25 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index ff6863b3c89..bcc75ed4644 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -124,6 +124,21 @@ public static String toChecksumAddress(String address) throws TronException { return sb.toString(); } + public static byte[] convertToTronAddress(byte[] address) { + byte[] newAddress = new byte[21]; + byte[] temp = new byte[] {Wallet.getAddressPreFixByte()}; + System.arraycopy(temp, 0, newAddress, 0, temp.length); + + if (address.length <= 20) { + int start = 20 - address.length; + System.arraycopy(address, 0, newAddress, temp.length + start, address.length); + } else { + int start = address.length - 20; + System.arraycopy(address, start, newAddress, temp.length, 20); + } + return newAddress; + } + public static String getMethodSign(String method) { byte[] selector = new byte[4]; System.arraycopy(Hash.sha3(method.getBytes()), 0, selector, 0, 4); @@ -576,10 +591,10 @@ public static long getUnfreezeAssetAmount(byte[] addressBytes, Wallet wallet) { } public static String int2HexString(int i) { - return "0x" + Integer.toHexString(i); + return "0x" + Integer.toUnsignedString(i, 16); } public static String long2HexString(long l) { - return "0x" + Long.toHexString(l); + return "0x" + Long.toUnsignedString(l, 16); } } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java index 4d138ff2c80..39c9cc51932 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java @@ -2,6 +2,7 @@ import static org.tron.core.Wallet.CONTRACT_VALIDATE_ERROR; import static org.tron.core.Wallet.CONTRACT_VALIDATE_EXCEPTION; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.convertToTronAddress; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.generateContractAddress; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getBlockID; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getMethodSign; @@ -300,11 +301,11 @@ private JSONObject formatRpcTransaction(Transaction transaction, TransactionInfo jsonObject.put("blockHash", getBlockID(block)); jsonObject.put("blockNumber", long2HexString(blockNum)); - jsonObject.put("gas", -1); //暂时不填 - jsonObject.put("gasPrice", -1); //暂时不填 - jsonObject.put("hash", txid); - jsonObject.put("input", ""); //暂时不填data字段 - jsonObject.put("nonce", -1); //暂时不写 + jsonObject.put("gas", null); //暂时不填 + jsonObject.put("gasPrice", null); //暂时不填 + jsonObject.put("hash", "0x" + txid); + jsonObject.put("input", null); //暂时不填data字段 + jsonObject.put("nonce", null); //暂时不写 byte[] owner = getOwner(transaction.getRawData().getContract(0)); ArrayList toAddressList = getTo(transaction); jsonObject.put("from", owner != null ? StringUtil.encode58Check(owner) : null); @@ -319,15 +320,16 @@ private JSONObject formatRpcTransaction(Transaction transaction, TransactionInfo } } jsonObject.put("transactionIndex", int2HexString(transactionIndex)); - jsonObject.put("value", getTransactionAmount(transaction.getRawData().getContract(0), txid, - blockNum, transactionInfo, wallet)); + long amount = getTransactionAmount(transaction.getRawData().getContract(0), txid, + blockNum, transactionInfo, wallet); + jsonObject.put("value", long2HexString(amount)); - ByteString signature = transaction.getSignature(0); + ByteString signature = transaction.getSignature(0); // r[32] + s[32] + 符号位v[1] byte[] signData = signature.toByteArray(); - byte v = (byte) (signData[0] - 27); - byte[] r = Arrays.copyOfRange(signData, 1, 33); - byte[] s = Arrays.copyOfRange(signData, 33, 65); - jsonObject.put("v", "0x" + int2HexString(v)); + byte v = (byte) (signData[64] + 27); //参考函数 Base64toBytes + byte[] r = Arrays.copyOfRange(signData, 0, 32); + byte[] s = Arrays.copyOfRange(signData, 32, 64); + jsonObject.put("v", int2HexString(v)); jsonObject.put("r", "0x" + ByteArray.toHexString(r)); jsonObject.put("s", "0x" + ByteArray.toHexString(s)); @@ -375,6 +377,9 @@ public JSONObject getTransactionReceipt(String txid) { .getTransactionById(ByteString.copyFrom(ByteArray.fromHexString(txid))); TransactionInfo transactionInfo = wallet .getTransactionInfoById(ByteString.copyFrom(ByteArray.fromHexString(txid))); + if (transaction == null || transactionInfo == null) { + return null; + } long blockNum = transactionInfo.getBlockNumber(); Block block = wallet.getBlockByNum(blockNum); @@ -395,19 +400,12 @@ public JSONObject getTransactionReceipt(String txid) { for (TransactionInfo info : reply.getTransactionInfoList()) { cumulativeGasUsed += info.getFee(); } - jsonObject.put("cumulativeGasUsed", cumulativeGasUsed); - jsonObject.put("gasUsed", transactionInfo.getFee()); + jsonObject.put("cumulativeGasUsed", long2HexString(cumulativeGasUsed)); + jsonObject.put("gasUsed", long2HexString(transactionInfo.getFee())); String contractAddress = null; - Transaction.Contract contract = transaction.getRawData().getContract(0); if (transaction.getRawData().getContract(0).getType() == ContractType.CreateSmartContract) { - try { - CreateSmartContract createSmartContract = - contract.getParameter().unpack(CreateSmartContract.class); - contractAddress = StringUtil.encode58Check(generateContractAddress(transaction)); - } catch (InvalidProtocolBufferException e) { - e.printStackTrace(); - } + contractAddress = StringUtil.encode58Check(generateContractAddress(transaction)); } jsonObject.put("contractAddress", contractAddress); @@ -421,7 +419,8 @@ public JSONObject getTransactionReceipt(String txid) { logItem.put("transactionIndex", jsonObject.getString("transactionIndex")); logItem.put("blockHash", jsonObject.getString("blockHash")); logItem.put("blockNumber", jsonObject.getString("blockNumber")); - logItem.put("address", StringUtil.encode58Check(log.getAddress().toByteArray())); + logItem.put("address", + StringUtil.encode58Check(convertToTronAddress(log.getAddress().toByteArray()))); logItem.put("data", "0x" + ByteArray.toHexString(log.getData().toByteArray())); String[] topics = new String[log.getTopicsCount()]; for (int i = 0; i < log.getTopicsCount(); i++) { From 9de5e975dddd3cc1104ab699f133bf1fb0b532c3 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Tue, 1 Jun 2021 18:25:07 +0800 Subject: [PATCH 013/341] feat: add eth_getBlockByHash --- .../java/org/tron/common/utils/ByteArray.java | 4 ++ .../core/services/jsonrpc/TestService.java | 53 ++++++++++++++++++ .../services/jsonrpc/TestServiceImpl.java | 56 ++++++++++++++++++- 3 files changed, 112 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/org/tron/common/utils/ByteArray.java b/common/src/main/java/org/tron/common/utils/ByteArray.java index b3426f6416c..71ed3a4d1c5 100644 --- a/common/src/main/java/org/tron/common/utils/ByteArray.java +++ b/common/src/main/java/org/tron/common/utils/ByteArray.java @@ -120,6 +120,10 @@ public static String toJsonHex(Long x) { return x == null ? null : "0x" + Long.toHexString(x); } + public static String toJsonHex(int x) { + return toJsonHex((long) x); + } + public static BigInteger hexToBigInteger(String input) { if (input.startsWith("0x")) { return new BigInteger(input.substring(2), 16); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java index e8661201191..f677aeca14a 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java @@ -2,12 +2,59 @@ import com.googlecode.jsonrpc4j.JsonRpcMethod; import java.math.BigInteger; +import java.util.Arrays; import org.springframework.stereotype.Component; import org.tron.core.exception.TronException; import org.tron.core.exception.ItemNotFoundException; @Component public interface TestService { + class BlockResult { + public String number; // QUANTITY - the block number. null when its pending block. + public String hash; // DATA, 32 Bytes - hash of the block. null when its pending block. + public String parentHash; // DATA, 32 Bytes - hash of the parent block. + public String nonce; // DATA, 8 Bytes - hash of the generated proof-of-work. null when its pending block. + public String sha3Uncles; // DATA, 32 Bytes - SHA3 of the uncles data in the block. + public String logsBloom; // DATA, 256 Bytes - the bloom filter for the logs of the block. null when its pending block. + public String transactionsRoot; // DATA, 32 Bytes - the root of the transaction trie of the block. + public String stateRoot; // DATA, 32 Bytes - the root of the final state trie of the block. + public String receiptsRoot; // DATA, 32 Bytes - the root of the receipts trie of the block. + public String miner; // DATA, 20 Bytes - the address of the beneficiary to whom the mining rewards were given. + public String difficulty; // QUANTITY - integer of the difficulty for this block. + public String totalDifficulty; // QUANTITY - integer of the total difficulty of the chain until this block. + public String extraData; // DATA - the "extra data" field of this block + public String size;//QUANTITY - integer the size of this block in bytes. + public String gasLimit;//: QUANTITY - the maximum gas allowed in this block. + public String gasUsed; // QUANTITY - the total used gas by all transactions in this block. + public String timestamp; //: QUANTITY - the unix timestamp for when the block was collated. + public Object[] transactions; //: Array - Array of transaction objects, or 32 Bytes transaction hashes depending on the last given parameter. + public String[] uncles; //: Array - Array of uncle hashes. + + @Override + public String toString() { + return "BlockResult{" + + "number='" + number + '\'' + + ", hash='" + hash + '\'' + + ", parentHash='" + parentHash + '\'' + + ", nonce='" + nonce + '\'' + + ", sha3Uncles='" + sha3Uncles + '\'' + + ", logsBloom='" + logsBloom + '\'' + + ", transactionsRoot='" + transactionsRoot + '\'' + + ", stateRoot='" + stateRoot + '\'' + + ", receiptsRoot='" + receiptsRoot + '\'' + + ", miner='" + miner + '\'' + + ", difficulty='" + difficulty + '\'' + + ", totalDifficulty='" + totalDifficulty + '\'' + + ", extraData='" + extraData + '\'' + + ", size='" + size + '\'' + + ", gas='" + gasLimit + '\'' + + ", gasUsed='" + gasUsed + '\'' + + ", timestamp='" + timestamp + '\'' + + ", transactions=" + Arrays.toString(transactions) + + ", uncles=" + Arrays.toString(uncles) + + '}'; + } + } @JsonRpcMethod("getInt") int getInt(int code); @@ -24,6 +71,12 @@ public interface TestService { @JsonRpcMethod("eth_getBlockTransactionCountByNumber") String ethGetBlockTransactionCountByNumber(String bnOrId) throws Exception; + @JsonRpcMethod("eth_getBlockByHash") + BlockResult ethGetBlockByHash(String blockHash, Boolean fullTransactionObjects) throws Exception; + + // @JsonRpcMethod("eth_getBlockByNumber") + // BlockResult ethGetBlockByNumber(String bnOrId, Boolean fullTransactionObjects) throws Exception; + @JsonRpcMethod("net_version") int getNetVersion(); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java index 665003a2762..063fbec7a3c 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java @@ -8,6 +8,7 @@ import com.google.protobuf.ByteString; import java.math.BigInteger; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; @@ -26,6 +27,7 @@ import org.tron.common.utils.Commons; import org.tron.common.utils.StringUtil; import org.tron.core.Wallet; +import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.TransactionCapsule; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.ItemNotFoundException; @@ -77,7 +79,7 @@ public String web3Sha3(String data) { } public String ethGetBlockTransactionCountByHash(String blockHash) throws Exception { - Block b = wallet.getBlockById(ByteString.copyFrom(ByteArray.fromHexString(blockHash))); + Block b = getBlockByJSonHash(blockHash); if (b == null) return null; long n = b.getTransactionsList().size(); @@ -92,6 +94,58 @@ public String ethGetBlockTransactionCountByNumber(String bnOrId) throws Exceptio return ByteArray.toJsonHex(n); } + public BlockResult ethGetBlockByHash(String blockHash, Boolean fullTransactionObjects) throws Exception { + final Block b = getBlockByJSonHash(blockHash); + return getBlockResult(b, fullTransactionObjects); + } + + private Block getBlockByJSonHash(String blockHash) throws Exception { + return wallet.getBlockById(ByteString.copyFrom(ByteArray.fromHexString(blockHash))); + } + + protected BlockResult getBlockResult(Block block, boolean fullTx) { + if (block == null) + return null; + + BlockCapsule blockCapsule = new BlockCapsule(block); + boolean isPending = false; + BlockResult br = new BlockResult(); + br.number = ByteArray.toJsonHex(blockCapsule.getNum()); + br.hash = ByteArray.toJsonHex(blockCapsule.getBlockId().getBytes()); + br.parentHash = ByteArray.toJsonHex(blockCapsule.getParentBlockId().getBytes()); + br.nonce = ""; // no value + br.sha3Uncles= ""; // no value + br.logsBloom = ""; // no value + br.transactionsRoot = ByteArray.toJsonHex(block.getBlockHeader().getRawData().getTxTrieRoot().toByteArray()); + br.stateRoot = ByteArray.toJsonHex(block.getBlockHeader().getRawData().getAccountStateRoot().toByteArray()); + br.receiptsRoot = ""; // no value + br.miner = ByteArray.toJsonHex(blockCapsule.getWitnessAddress().toByteArray()); + br.difficulty = ""; // no value + br.totalDifficulty = ""; // no value + // br.extraData // no value + br.size = ByteArray.toJsonHex(block.getSerializedSize()); + br.gasLimit = ""; + br.gasUsed = ""; + br.timestamp = ByteArray.toJsonHex(blockCapsule.getTimeStamp()); + + List txes = new ArrayList<>(); + if (fullTx) { + for (int i = 0; i < block.getTransactionsList().size(); i++) { + // txes.add(new TransactionResultDTO(block, i, block.getTransactionsList().get(i))); + } + } else { + for (Transaction tx : block.getTransactionsList()) { + txes.add(ByteArray.toJsonHex(new TransactionCapsule(tx).getTransactionId().getBytes())); + } + } + br.transactions = txes.toArray(); + + List ul = new ArrayList<>(); + br.uncles = ul.toArray(new String[ul.size()]); + + return br; + } + @Override public int getNetVersion() { //当前链的id,不能跟metamask已有的id冲突 From 9c5245faa57a4c1e5300475f71ca0d614752a7c6 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Tue, 1 Jun 2021 19:06:44 +0800 Subject: [PATCH 014/341] add test --- .../core/services/jsonrpc/TestServiceImpl.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java index 39c9cc51932..de60e5d6d52 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java @@ -286,10 +286,14 @@ public JSONObject getTransactionByHash(String txid) { .getTransactionById(ByteString.copyFrom(ByteArray.fromHexString(txid))); TransactionInfo transactionInfo = wallet .getTransactionInfoById(ByteString.copyFrom(ByteArray.fromHexString(txid))); - + if (transaction == null || transactionInfo == null) { + return null; + } long blockNum = transactionInfo.getBlockNumber(); Block block = wallet.getBlockByNum(blockNum); - + if (block == null) { + return null; + } return formatRpcTransaction(transaction, transactionInfo, block); } @@ -349,7 +353,9 @@ public JSONObject getTransactionByBlockHashAndIndex(String blockHash, int index) String txid = getTxID(transaction); TransactionInfo transactionInfo = wallet.getTransactionInfoById( ByteString.copyFrom(ByteArray.fromHexString(txid))); - + if (transactionInfo == null) { + return null; + } return formatRpcTransaction(transaction, transactionInfo, block); } @@ -366,7 +372,9 @@ public JSONObject getTransactionByBlockNumberAndIndex(int blockNum, int index) { String txid = getTxID(transaction); TransactionInfo transactionInfo = wallet.getTransactionInfoById( ByteString.copyFrom(ByteArray.fromHexString(txid))); - + if (transactionInfo == null) { + return null; + } return formatRpcTransaction(transaction, transactionInfo, block); } From 79403ea265ca83352ddce28ef0e43136bd457e9c Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 2 Jun 2021 14:06:18 +0800 Subject: [PATCH 015/341] feat: add TransactionResultDTO --- .../core/services/jsonrpc/JsonRpcApiUtil.java | 25 +++++++ .../core/services/jsonrpc/TestService.java | 40 +++++----- .../services/jsonrpc/TestServiceImpl.java | 2 +- .../jsonrpc/TransactionResultDTO.java | 73 +++++++++++++++++++ 4 files changed, 119 insertions(+), 21 deletions(-) create mode 100644 framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResultDTO.java diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index bcc75ed4644..bf7a6e50738 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -437,6 +437,31 @@ public static String getTxID(Transaction transaction) { return ByteArray.toHexString(Sha256Hash.hash(true, transaction.getRawData().toByteArray())); } + public static long getTransactionAmount(Transaction.Contract contract, String hash, + Wallet wallet) { + long amount = 0; + try { + switch (contract.getType()) { + case UnfreezeBalanceContract: + case WithdrawBalanceContract: + TransactionInfo transactionInfo = wallet + .getTransactionInfoById(ByteString.copyFrom(ByteArray.fromHexString(hash))); + amount = getAmountFromTransactionInfo(hash, contract.getType(), transactionInfo); + break; + default: + amount = getTransactionAmount(contract, hash, 0, null, wallet); + break; + } + } catch (Exception e) { + logger.error("Exception happens when get amount. Exception = [{}]", + Throwables.getStackTraceAsString(e)); + } catch (Throwable t) { + t.printStackTrace(); + } + + return amount; + } + /** * 获取交易的 amount */ diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java index be2ee40113b..3bd1dff3dc7 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java @@ -34,26 +34,26 @@ class BlockResult { @Override public String toString() { return "BlockResult{" + - "number='" + number + '\'' + - ", hash='" + hash + '\'' + - ", parentHash='" + parentHash + '\'' + - ", nonce='" + nonce + '\'' + - ", sha3Uncles='" + sha3Uncles + '\'' + - ", logsBloom='" + logsBloom + '\'' + - ", transactionsRoot='" + transactionsRoot + '\'' + - ", stateRoot='" + stateRoot + '\'' + - ", receiptsRoot='" + receiptsRoot + '\'' + - ", miner='" + miner + '\'' + - ", difficulty='" + difficulty + '\'' + - ", totalDifficulty='" + totalDifficulty + '\'' + - ", extraData='" + extraData + '\'' + - ", size='" + size + '\'' + - ", gas='" + gasLimit + '\'' + - ", gasUsed='" + gasUsed + '\'' + - ", timestamp='" + timestamp + '\'' + - ", transactions=" + Arrays.toString(transactions) + - ", uncles=" + Arrays.toString(uncles) + - '}'; + "number='" + number + '\'' + + ", hash='" + hash + '\'' + + ", parentHash='" + parentHash + '\'' + + ", nonce='" + nonce + '\'' + + ", sha3Uncles='" + sha3Uncles + '\'' + + ", logsBloom='" + logsBloom + '\'' + + ", transactionsRoot='" + transactionsRoot + '\'' + + ", stateRoot='" + stateRoot + '\'' + + ", receiptsRoot='" + receiptsRoot + '\'' + + ", miner='" + miner + '\'' + + ", difficulty='" + difficulty + '\'' + + ", totalDifficulty='" + totalDifficulty + '\'' + + ", extraData='" + extraData + '\'' + + ", size='" + size + '\'' + + ", gas='" + gasLimit + '\'' + + ", gasUsed='" + gasUsed + '\'' + + ", timestamp='" + timestamp + '\'' + + ", transactions=" + Arrays.toString(transactions) + + ", uncles=" + Arrays.toString(uncles) + + '}'; } } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java index b84a4bab2d5..3bfa40ab146 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java @@ -148,7 +148,7 @@ protected BlockResult getBlockResult(Block block, boolean fullTx) { List txes = new ArrayList<>(); if (fullTx) { for (int i = 0; i < block.getTransactionsList().size(); i++) { - // txes.add(new TransactionResultDTO(block, i, block.getTransactionsList().get(i))); + txes.add(new TransactionResultDTO(block, i, block.getTransactionsList().get(i), wallet)); } } else { for (Transaction tx : block.getTransactionsList()) { diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResultDTO.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResultDTO.java new file mode 100644 index 00000000000..fc8fca70af7 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResultDTO.java @@ -0,0 +1,73 @@ +package org.tron.core.services.jsonrpc; + +import lombok.Value; +import org.tron.common.utils.ByteArray; +import org.tron.core.Wallet; +import org.tron.core.capsule.BlockCapsule; +import org.tron.core.capsule.TransactionCapsule; +import org.tron.protos.Protocol.Block; +import org.tron.protos.Protocol.Transaction; +import org.tron.protos.Protocol.Transaction.Contract; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTransactionAmount; + +@Value +public class TransactionResultDTO { + + public String hash; + public String nonce; + public String blockHash; + public String blockNumber; + public String transactionIndex; + + public String from; + public String to; + public String gas; + public String gasPrice; + public String value; + public String input; + + public TransactionResultDTO(Block b, int index, Transaction tx, Wallet wallet) { + BlockCapsule blockCapsule = new BlockCapsule(b); + + byte[] txid = new TransactionCapsule(tx).getTransactionId().getBytes(); + hash = ByteArray.toJsonHex(txid); + nonce = ""; // no value + blockHash = ByteArray.toJsonHex(blockCapsule.getBlockId().getBytes()); + blockNumber = ByteArray.toJsonHex(blockCapsule.getNum()); + transactionIndex = ByteArray.toJsonHex(index); + + if (!tx.getRawData().getContractList().isEmpty()) { + Contract contract = tx.getRawData().getContract(0); + from = ByteArray.toJsonHex(TransactionCapsule.getOwner(contract)); + to = ByteArray.toJsonHex(TransactionCapsule.getToAddress(contract)); + value = ByteArray.toJsonHex(getTransactionAmount(contract, hash, wallet)); + } else { + from = ""; + to = ""; + value = ""; + } + + gas = ""; + gasPrice = ""; + + + input = ""; + } + + @Override + public String toString() { + return "TransactionResultDTO{" + + "hash='" + hash + '\'' + + ", nonce='" + nonce + '\'' + + ", blockHash='" + blockHash + '\'' + + ", blockNumber='" + blockNumber + '\'' + + ", transactionIndex='" + transactionIndex + '\'' + + ", from='" + from + '\'' + + ", to='" + to + '\'' + + ", gas='" + gas + '\'' + + ", gasPrice='" + gasPrice + '\'' + + ", value='" + value + '\'' + + ", input='" + input + '\'' + + '}'; + } +} \ No newline at end of file From d3ab3b89745a77c6438fe9a3f7e45cfbe9c942c0 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 2 Jun 2021 14:20:30 +0800 Subject: [PATCH 016/341] typo --- .../core/services/jsonrpc/JsonRpcApiUtil.java | 18 ++++---- .../core/services/jsonrpc/TestService.java | 43 +++++++++---------- .../services/jsonrpc/TestServiceImpl.java | 23 ++++++---- .../jsonrpc/TransactionResultDTO.java | 4 +- 4 files changed, 47 insertions(+), 41 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index bf7a6e50738..b5aafa4900b 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -238,15 +238,15 @@ public static byte[] getOwner(Transaction.Contract contract) { case ProposalDeleteContract: owner = contractParameter.unpack(ProposalDeleteContract.class).getOwnerAddress(); break; -// case BuyStorageContract: -// owner = contractParameter.unpack(BuyStorageContract.class).getOwnerAddress(); -// break; -// case BuyStorageBytesContract: -// owner = contractParameter.unpack(BuyStorageBytesContract.class).getOwnerAddress(); -// break; -// case SellStorageContract: -// owner = contractParameter.unpack(SellStorageContract.class).getOwnerAddress(); -// break; + // case BuyStorageContract: + // owner = contractParameter.unpack(BuyStorageContract.class).getOwnerAddress(); + // break; + // case BuyStorageBytesContract: + // owner = contractParameter.unpack(BuyStorageBytesContract.class).getOwnerAddress(); + // break; + // case SellStorageContract: + // owner = contractParameter.unpack(SellStorageContract.class).getOwnerAddress(); + // break; case UpdateSettingContract: owner = contractParameter.unpack(UpdateSettingContract.class) .getOwnerAddress(); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java index 3bd1dff3dc7..f3b1d2693c5 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java @@ -5,36 +5,35 @@ import java.math.BigInteger; import java.util.Arrays; import org.springframework.stereotype.Component; -import org.tron.core.exception.TronException; import org.tron.core.exception.ItemNotFoundException; @Component public interface TestService { class BlockResult { - public String number; // QUANTITY - the block number. null when its pending block. - public String hash; // DATA, 32 Bytes - hash of the block. null when its pending block. - public String parentHash; // DATA, 32 Bytes - hash of the parent block. - public String nonce; // DATA, 8 Bytes - hash of the generated proof-of-work. null when its pending block. - public String sha3Uncles; // DATA, 32 Bytes - SHA3 of the uncles data in the block. - public String logsBloom; // DATA, 256 Bytes - the bloom filter for the logs of the block. null when its pending block. - public String transactionsRoot; // DATA, 32 Bytes - the root of the transaction trie of the block. - public String stateRoot; // DATA, 32 Bytes - the root of the final state trie of the block. - public String receiptsRoot; // DATA, 32 Bytes - the root of the receipts trie of the block. - public String miner; // DATA, 20 Bytes - the address of the beneficiary to whom the mining rewards were given. - public String difficulty; // QUANTITY - integer of the difficulty for this block. - public String totalDifficulty; // QUANTITY - integer of the total difficulty of the chain until this block. - public String extraData; // DATA - the "extra data" field of this block - public String size;//QUANTITY - integer the size of this block in bytes. - public String gasLimit;//: QUANTITY - the maximum gas allowed in this block. - public String gasUsed; // QUANTITY - the total used gas by all transactions in this block. - public String timestamp; //: QUANTITY - the unix timestamp for when the block was collated. - public Object[] transactions; //: Array - Array of transaction objects, or 32 Bytes transaction hashes depending on the last given parameter. - public String[] uncles; //: Array - Array of uncle hashes. + public String number; + public String hash; + public String parentHash; + public String nonce; + public String sha3Uncles; + public String logsBloom; + public String transactionsRoot; + public String stateRoot; + public String receiptsRoot; + public String miner; + public String difficulty; + public String totalDifficulty; + public String extraData; + public String size; + public String gasLimit; + public String gasUsed; + public String timestamp; + public Object[] transactions; + public String[] uncles; @Override public String toString() { - return "BlockResult{" + - "number='" + number + '\'' + return "BlockResult{" + + "number='" + number + '\'' + ", hash='" + hash + '\'' + ", parentHash='" + parentHash + '\'' + ", nonce='" + nonce + '\'' diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java index 3bfa40ab146..78ec783c6d9 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java @@ -95,7 +95,9 @@ public String web3Sha3(String data) { public String ethGetBlockTransactionCountByHash(String blockHash) throws Exception { Block b = getBlockByJSonHash(blockHash); - if (b == null) return null; + if (b == null) { + return null; + } long n = b.getTransactionsList().size(); return ByteArray.toJsonHex(n); @@ -111,7 +113,8 @@ public String ethGetBlockTransactionCountByNumber(String bnOrId) throws Exceptio return ByteArray.toJsonHex(n); } - public BlockResult ethGetBlockByHash(String blockHash, Boolean fullTransactionObjects) throws Exception { + public BlockResult ethGetBlockByHash(String blockHash, Boolean fullTransactionObjects) + throws Exception { final Block b = getBlockByJSonHash(blockHash); return getBlockResult(b, fullTransactionObjects); } @@ -121,8 +124,9 @@ private Block getBlockByJSonHash(String blockHash) throws Exception { } protected BlockResult getBlockResult(Block block, boolean fullTx) { - if (block == null) + if (block == null) { return null; + } BlockCapsule blockCapsule = new BlockCapsule(block); boolean isPending = false; @@ -131,10 +135,12 @@ protected BlockResult getBlockResult(Block block, boolean fullTx) { br.hash = ByteArray.toJsonHex(blockCapsule.getBlockId().getBytes()); br.parentHash = ByteArray.toJsonHex(blockCapsule.getParentBlockId().getBytes()); br.nonce = ""; // no value - br.sha3Uncles= ""; // no value + br.sha3Uncles = ""; // no value br.logsBloom = ""; // no value - br.transactionsRoot = ByteArray.toJsonHex(block.getBlockHeader().getRawData().getTxTrieRoot().toByteArray()); - br.stateRoot = ByteArray.toJsonHex(block.getBlockHeader().getRawData().getAccountStateRoot().toByteArray()); + br.transactionsRoot = ByteArray + .toJsonHex(block.getBlockHeader().getRawData().getTxTrieRoot().toByteArray()); + br.stateRoot = ByteArray + .toJsonHex(block.getBlockHeader().getRawData().getAccountStateRoot().toByteArray()); br.receiptsRoot = ""; // no value br.miner = ByteArray.toJsonHex(blockCapsule.getWitnessAddress().toByteArray()); br.difficulty = ""; // no value @@ -360,8 +366,9 @@ private JSONObject formatRpcTransaction(Transaction transaction, TransactionInfo byte[] owner = getOwner(transaction.getRawData().getContract(0)); ArrayList toAddressList = getTo(transaction); jsonObject.put("from", owner != null ? StringUtil.encode58Check(owner) : null); - jsonObject.put("to", toAddressList.size() > 0 ? - StringUtil.encode58Check(toAddressList.get(0).toByteArray()) : null); + jsonObject.put("to", toAddressList.size() > 0 + ? StringUtil.encode58Check(toAddressList.get(0).toByteArray()) + : null); int transactionIndex = -1; for (int index = 0; index < block.getTransactionsCount(); index++) { diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResultDTO.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResultDTO.java index fc8fca70af7..bd16b916bee 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResultDTO.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResultDTO.java @@ -1,5 +1,7 @@ package org.tron.core.services.jsonrpc; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTransactionAmount; + import lombok.Value; import org.tron.common.utils.ByteArray; import org.tron.core.Wallet; @@ -8,7 +10,6 @@ import org.tron.protos.Protocol.Block; import org.tron.protos.Protocol.Transaction; import org.tron.protos.Protocol.Transaction.Contract; -import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTransactionAmount; @Value public class TransactionResultDTO { @@ -50,7 +51,6 @@ public TransactionResultDTO(Block b, int index, Transaction tx, Wallet wallet) { gas = ""; gasPrice = ""; - input = ""; } From d2589cfebdba486ab426445ce786262f6648390b Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 2 Jun 2021 15:10:08 +0800 Subject: [PATCH 017/341] feat: add eth_getBlockByNumber --- .../org/tron/core/services/jsonrpc/TestService.java | 4 ++-- .../tron/core/services/jsonrpc/TestServiceImpl.java | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java index f3b1d2693c5..94a99c39f34 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java @@ -74,8 +74,8 @@ public String toString() { @JsonRpcMethod("eth_getBlockByHash") BlockResult ethGetBlockByHash(String blockHash, Boolean fullTransactionObjects) throws Exception; - // @JsonRpcMethod("eth_getBlockByNumber") - // BlockResult ethGetBlockByNumber(String bnOrId, Boolean fullTransactionObjects) throws Exception; + @JsonRpcMethod("eth_getBlockByNumber") + BlockResult ethGetBlockByNumber(String bnOrId, Boolean fullTransactionObjects) throws Exception; @JsonRpcMethod("net_version") int getNetVersion(); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java index 78ec783c6d9..f9e6699a520 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java @@ -22,6 +22,7 @@ import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.regex.Matcher; @@ -119,6 +120,16 @@ public BlockResult ethGetBlockByHash(String blockHash, Boolean fullTransactionOb return getBlockResult(b, fullTransactionObjects); } + public BlockResult ethGetBlockByNumber(String bnOrId, Boolean fullTransactionObjects) { + final Block b; + if ("pending".equalsIgnoreCase(bnOrId)) { + b = null; + } else { + b = wallet.getByJsonBlockId(bnOrId); + } + return (b == null ? null : getBlockResult(b, fullTransactionObjects)); + } + private Block getBlockByJSonHash(String blockHash) throws Exception { return wallet.getBlockById(ByteString.copyFrom(ByteArray.fromHexString(blockHash))); } From 5ec32537f3a85efad0ede84614865ba277c24970 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 2 Jun 2021 16:59:09 +0800 Subject: [PATCH 018/341] feat: use JsonRpcApiUtil to get toAddress --- .../core/services/jsonrpc/JsonRpcApiUtil.java | 31 ++++++++++++------- .../services/jsonrpc/TestServiceImpl.java | 4 +-- .../jsonrpc/TransactionResultDTO.java | 3 +- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index b5aafa4900b..0c6720df181 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -302,9 +302,18 @@ public static byte[] getOwner(Transaction.Contract contract) { return owner == null ? null : owner.toByteArray(); } - public static ArrayList getTo(Transaction transaction) { + public static byte[] getToAddress(Transaction transaction) { + List toAddressList = getTo(transaction); + if (!toAddressList.isEmpty()) { + return toAddressList.get(0).toByteArray(); + } else { + return null; + } + } + + public static List getTo(Transaction transaction) { Transaction.Contract contract = transaction.getRawData().getContract(0); - ArrayList list = new ArrayList<>(); + List list = new ArrayList<>(); try { Any contractParameter = contract.getParameter(); switch (contract.getType()) { @@ -370,15 +379,15 @@ public static ArrayList getTo(Transaction transaction) { break; case ProposalDeleteContract: break; -// case BuyStorageContract: -// owner = contractParameter.unpack(BuyStorageContract.class).getOwnerAddress(); -// break; -// case BuyStorageBytesContract: -// owner = contractParameter.unpack(BuyStorageBytesContract.class).getOwnerAddress(); -// break; -// case SellStorageContract: -// owner = contractParameter.unpack(SellStorageContract.class).getOwnerAddress(); -// break; + // case BuyStorageContract: + // owner = contractParameter.unpack(BuyStorageContract.class).getOwnerAddress(); + // break; + // case BuyStorageBytesContract: + // owner = contractParameter.unpack(BuyStorageBytesContract.class).getOwnerAddress(); + // break; + // case SellStorageContract: + // owner = contractParameter.unpack(SellStorageContract.class).getOwnerAddress(); + // break; case UpdateSettingContract: list.add(contractParameter.unpack(UpdateSettingContract.class).getContractAddress()); break; diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java index f9e6699a520..a5ae6e52df2 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java @@ -375,9 +375,9 @@ private JSONObject formatRpcTransaction(Transaction transaction, TransactionInfo jsonObject.put("input", null); //暂时不填data字段 jsonObject.put("nonce", null); //暂时不写 byte[] owner = getOwner(transaction.getRawData().getContract(0)); - ArrayList toAddressList = getTo(transaction); + List toAddressList = getTo(transaction); jsonObject.put("from", owner != null ? StringUtil.encode58Check(owner) : null); - jsonObject.put("to", toAddressList.size() > 0 + jsonObject.put("to", !toAddressList.isEmpty() ? StringUtil.encode58Check(toAddressList.get(0).toByteArray()) : null); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResultDTO.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResultDTO.java index bd16b916bee..c67fb6d0acc 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResultDTO.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResultDTO.java @@ -1,6 +1,7 @@ package org.tron.core.services.jsonrpc; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTransactionAmount; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getToAddress; import lombok.Value; import org.tron.common.utils.ByteArray; @@ -40,7 +41,7 @@ public TransactionResultDTO(Block b, int index, Transaction tx, Wallet wallet) { if (!tx.getRawData().getContractList().isEmpty()) { Contract contract = tx.getRawData().getContract(0); from = ByteArray.toJsonHex(TransactionCapsule.getOwner(contract)); - to = ByteArray.toJsonHex(TransactionCapsule.getToAddress(contract)); + to = ByteArray.toJsonHex(getToAddress(tx)); value = ByteArray.toJsonHex(getTransactionAmount(contract, hash, wallet)); } else { from = ""; From 6ee83bca18203c070f8c6ccd1d26701e53f7d47b Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Thu, 3 Jun 2021 11:37:18 +0800 Subject: [PATCH 019/341] return TransactionReceipt instead of jsonobject in api getTransactionReceipt --- .../core/services/jsonrpc/JsonRpcApiUtil.java | 13 +- .../services/jsonrpc/StreamClientDemo.java | 2 +- .../core/services/jsonrpc/TestService.java | 16 +- .../services/jsonrpc/TestServiceImpl.java | 213 ++++++++---------- .../services/jsonrpc/TransactionReceipt.java | 41 ++++ .../jsonrpc/TransactionResultDTO.java | 31 ++- 6 files changed, 186 insertions(+), 130 deletions(-) create mode 100644 framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index 0c6720df181..f615da8b8b5 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -13,6 +13,7 @@ import org.spongycastle.util.encoders.Hex; import org.tron.api.GrpcAPI.AssetIssueList; import org.tron.common.crypto.Hash; +import org.tron.common.utils.Base58; import org.tron.common.utils.ByteArray; import org.tron.common.utils.Commons; import org.tron.common.utils.Sha256Hash; @@ -97,7 +98,7 @@ public static String ethToTronAddress(String ethAddress) { } //reference: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-55.md - public static String toChecksumAddress(String address) throws TronException { + private static String toChecksumAddress(String address) throws TronException { StringBuffer sb = new StringBuffer(); int nibble; @@ -139,6 +140,16 @@ public static byte[] convertToTronAddress(byte[] address) { return newAddress; } + /** + * 把byte数组转换为base58编码 + */ + public static String encode58Check(byte[] input) { + if (input == null || input.length == 0) { + return ""; + } + return StringUtil.encode58Check(input); + } + public static String getMethodSign(String method) { byte[] selector = new byte[4]; System.arraycopy(Hash.sha3(method.getBytes()), 0, selector, 0, 4); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/StreamClientDemo.java b/framework/src/main/java/org/tron/core/services/jsonrpc/StreamClientDemo.java index f0c30374624..3da50bd49b4 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/StreamClientDemo.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/StreamClientDemo.java @@ -27,7 +27,7 @@ public void client() throws Throwable { List params = new ArrayList<>(); params.add(12); - Integer res = jsonRpcClient.invokeAndReadResponse("getInt", params, Integer.class, + Integer res = jsonRpcClient.invokeAndReadResponse("getNetVersion", params, Integer.class, socket.getOutputStream(), socket.getInputStream()); System.out.println(res); //传参方法三:通过ProxyUtil 客户端调用 diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java index 94a99c39f34..e86e8fdffb3 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java @@ -27,7 +27,7 @@ class BlockResult { public String gasLimit; public String gasUsed; public String timestamp; - public Object[] transactions; + public Object[] transactions; //one of TransactionResultDTO、byte32 public String[] uncles; @Override @@ -56,9 +56,6 @@ public String toString() { } } - @JsonRpcMethod("getInt") - int getInt(int code); - @JsonRpcMethod("web3_clientVersion") String web3ClientVersion(); @@ -116,18 +113,15 @@ public String toString() { @JsonRpcMethod("eth_getCompilers") String[] getCompilers(); - @JsonRpcMethod("eth_compileSolidity") - String compileSolidity(String source); - @JsonRpcMethod("eth_getTransactionByHash") - JSONObject getTransactionByHash(String txid); + TransactionResultDTO getTransactionByHash(String txid); @JsonRpcMethod("eth_getTransactionByBlockHashAndIndex") - JSONObject getTransactionByBlockHashAndIndex(String blockHash, int index); + TransactionResultDTO getTransactionByBlockHashAndIndex(String blockHash, int index); @JsonRpcMethod("eth_getTransactionByBlockNumberAndIndex") - JSONObject getTransactionByBlockNumberAndIndex(int blockNum, int index); + TransactionResultDTO getTransactionByBlockNumberAndIndex(int blockNum, int index); @JsonRpcMethod("eth_gettransactionreceipt") - JSONObject getTransactionReceipt(String txid); + TransactionReceipt getTransactionReceipt(String txid); } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java index ff08bd0f219..69eb8503803 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java @@ -3,26 +3,16 @@ import static org.tron.core.Wallet.CONTRACT_VALIDATE_ERROR; import static org.tron.core.Wallet.CONTRACT_VALIDATE_EXCEPTION; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.convertToTronAddress; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.encode58Check; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.generateContractAddress; -import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getBlockID; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getMethodSign; -import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getOwner; -import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTo; -import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTransactionAmount; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTxID; -import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.int2HexString; -import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.long2HexString; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.triggerCallContract; -import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.tronToEthAddress; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; import com.google.protobuf.ByteString; -import com.google.protobuf.InvalidProtocolBufferException; import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.regex.Matcher; @@ -39,7 +29,6 @@ import org.tron.common.utils.ByteArray; import org.tron.common.utils.ByteUtil; import org.tron.common.utils.Commons; -import org.tron.common.utils.StringUtil; import org.tron.core.Wallet; import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.TransactionCapsule; @@ -53,7 +42,6 @@ import org.tron.protos.Protocol.Transaction; import org.tron.protos.Protocol.Transaction.Contract.ContractType; import org.tron.protos.Protocol.TransactionInfo; -import org.tron.protos.contract.SmartContractOuterClass.CreateSmartContract; import org.tron.protos.contract.SmartContractOuterClass.SmartContract; import org.tron.protos.contract.SmartContractOuterClass.TriggerSmartContract; @@ -63,8 +51,8 @@ public class TestServiceImpl implements TestService { private NodeInfoService nodeInfoService; private Wallet wallet; - public TestServiceImpl() { - } +// public TestServiceImpl() { +// } public TestServiceImpl(NodeInfoService nodeInfoService, Wallet wallet) { this.nodeInfoService = nodeInfoService; @@ -72,10 +60,6 @@ public TestServiceImpl(NodeInfoService nodeInfoService, Wallet wallet) { } @Override - public int getInt(int code) { - return code; - } - public String web3ClientVersion() { Pattern shortVersion = Pattern.compile("(\\d\\.\\d).*"); Matcher matcher = shortVersion.matcher(System.getProperty("java.version")); @@ -89,11 +73,13 @@ public String web3ClientVersion() { .collect(Collectors.joining("/")); } + @Override public String web3Sha3(String data) { byte[] result = Hash.sha3(ByteArray.fromHexString(data)); return ByteArray.toJsonHex(result); } + @Override public String ethGetBlockTransactionCountByHash(String blockHash) throws Exception { Block b = getBlockByJSonHash(blockHash); if (b == null) { @@ -104,6 +90,7 @@ public String ethGetBlockTransactionCountByHash(String blockHash) throws Excepti return ByteArray.toJsonHex(n); } + @Override public String ethGetBlockTransactionCountByNumber(String bnOrId) throws Exception { List list = wallet.getTransactionsByJsonBlockId(bnOrId); if (list == null) { @@ -114,12 +101,14 @@ public String ethGetBlockTransactionCountByNumber(String bnOrId) throws Exceptio return ByteArray.toJsonHex(n); } + @Override public BlockResult ethGetBlockByHash(String blockHash, Boolean fullTransactionObjects) throws Exception { final Block b = getBlockByJSonHash(blockHash); return getBlockResult(b, fullTransactionObjects); } + @Override public BlockResult ethGetBlockByNumber(String bnOrId, Boolean fullTransactionObjects) { final Block b; if ("pending".equalsIgnoreCase(bnOrId)) { @@ -307,9 +296,10 @@ public Object isSyncing() { @Override public String getCoinbase() { + //获取最新块的产块sr地址 byte[] witnessAddress = wallet.getNowBlock().getBlockHeader().getRawData().getWitnessAddress() .toByteArray(); - return StringUtil.encode58Check(witnessAddress); + return encode58Check(witnessAddress); } @Override @@ -343,13 +333,7 @@ public String[] getCompilers() { } @Override - public String compileSolidity(String source) { - //耗费cpu太高,采用trongrid中心化服务器实现。 - return null; - } - - @Override - public JSONObject getTransactionByHash(String txid) { + public TransactionResultDTO getTransactionByHash(String txid) { Transaction transaction = wallet .getTransactionById(ByteString.copyFrom(ByteArray.fromHexString(txid))); TransactionInfo transactionInfo = wallet @@ -362,29 +346,12 @@ public JSONObject getTransactionByHash(String txid) { if (block == null) { return null; } - return formatRpcTransaction(transaction, transactionInfo, block); + return formatRpcTransaction(transaction, block); } - private JSONObject formatRpcTransaction(Transaction transaction, TransactionInfo transactionInfo, - Block block) { - String txid = ByteArray.toHexString(transactionInfo.getId().toByteArray()); - long blockNum = block.getBlockHeader().getRawData().getNumber(); - JSONObject jsonObject = new JSONObject(true); - jsonObject.put("blockHash", getBlockID(block)); - jsonObject.put("blockNumber", long2HexString(blockNum)); - - jsonObject.put("gas", null); //暂时不填 - jsonObject.put("gasPrice", null); //暂时不填 - jsonObject.put("hash", "0x" + txid); - jsonObject.put("input", null); //暂时不填data字段 - jsonObject.put("nonce", null); //暂时不写 - byte[] owner = getOwner(transaction.getRawData().getContract(0)); - List toAddressList = getTo(transaction); - jsonObject.put("from", owner != null ? StringUtil.encode58Check(owner) : null); - jsonObject.put("to", !toAddressList.isEmpty() - ? StringUtil.encode58Check(toAddressList.get(0).toByteArray()) - : null); - + private TransactionResultDTO formatRpcTransaction(Transaction transaction, Block block) { + String txid = ByteArray.toHexString( + new TransactionCapsule(transaction).getTransactionId().getBytes()); int transactionIndex = -1; for (int index = 0; index < block.getTransactionsCount(); index++) { if (getTxID(block.getTransactions(index)).equals(txid)) { @@ -392,25 +359,55 @@ private JSONObject formatRpcTransaction(Transaction transaction, TransactionInfo break; } } - jsonObject.put("transactionIndex", int2HexString(transactionIndex)); - long amount = getTransactionAmount(transaction.getRawData().getContract(0), txid, - blockNum, transactionInfo, wallet); - jsonObject.put("value", long2HexString(amount)); - - ByteString signature = transaction.getSignature(0); // r[32] + s[32] + 符号位v[1] - byte[] signData = signature.toByteArray(); - byte v = (byte) (signData[64] + 27); //参考函数 Base64toBytes - byte[] r = Arrays.copyOfRange(signData, 0, 32); - byte[] s = Arrays.copyOfRange(signData, 32, 64); - jsonObject.put("v", int2HexString(v)); - jsonObject.put("r", "0x" + ByteArray.toHexString(r)); - jsonObject.put("s", "0x" + ByteArray.toHexString(s)); - - return jsonObject; + return new TransactionResultDTO(block, transactionIndex, transaction, wallet); } +// private JSONObject formatRpcTransaction(Transaction transaction, TransactionInfo transactionInfo, +// Block block) { +// String txid = ByteArray.toHexString(transactionInfo.getId().toByteArray()); +// long blockNum = block.getBlockHeader().getRawData().getNumber(); +// JSONObject jsonObject = new JSONObject(true); +// jsonObject.put("blockHash", getBlockID(block)); +// jsonObject.put("blockNumber", long2HexString(blockNum)); +// +// jsonObject.put("gas", null); //暂时不填 +// jsonObject.put("gasPrice", null); //暂时不填 +// jsonObject.put("hash", "0x" + txid); +// jsonObject.put("input", null); //暂时不填data字段 +// jsonObject.put("nonce", null); //暂时不写 +// byte[] owner = getOwner(transaction.getRawData().getContract(0)); +// List toAddressList = getTo(transaction); +// jsonObject.put("from", owner != null ? encode58Check(owner) : null); +// jsonObject.put("to", !toAddressList.isEmpty() +// ? encode58Check(toAddressList.get(0).toByteArray()) +// : null); +// +// int transactionIndex = -1; +// for (int index = 0; index < block.getTransactionsCount(); index++) { +// if (getTxID(block.getTransactions(index)).equals(txid)) { +// transactionIndex = index; +// break; +// } +// } +// jsonObject.put("transactionIndex", int2HexString(transactionIndex)); +// long amount = getTransactionAmount(transaction.getRawData().getContract(0), txid, +// blockNum, transactionInfo, wallet); +// jsonObject.put("value", long2HexString(amount)); +// +// ByteString signature = transaction.getSignature(0); // r[32] + s[32] + 符号位v[1] +// byte[] signData = signature.toByteArray(); +// byte v = (byte) (signData[64] + 27); //参考函数 Base64toBytes +// byte[] r = Arrays.copyOfRange(signData, 0, 32); +// byte[] s = Arrays.copyOfRange(signData, 32, 64); +// jsonObject.put("v", int2HexString(v)); +// jsonObject.put("r", "0x" + ByteArray.toHexString(r)); +// jsonObject.put("s", "0x" + ByteArray.toHexString(s)); +// +// return jsonObject; +// } + @Override - public JSONObject getTransactionByBlockHashAndIndex(String blockHash, int index) { + public TransactionResultDTO getTransactionByBlockHashAndIndex(String blockHash, int index) { Block block = wallet.getBlockById(ByteString.copyFrom(ByteArray.fromHexString(blockHash))); if (block == null) { return null; @@ -419,17 +416,11 @@ public JSONObject getTransactionByBlockHashAndIndex(String blockHash, int index) return null; } Transaction transaction = block.getTransactions(index); - String txid = getTxID(transaction); - TransactionInfo transactionInfo = wallet.getTransactionInfoById( - ByteString.copyFrom(ByteArray.fromHexString(txid))); - if (transactionInfo == null) { - return null; - } - return formatRpcTransaction(transaction, transactionInfo, block); + return formatRpcTransaction(transaction, block); } @Override - public JSONObject getTransactionByBlockNumberAndIndex(int blockNum, int index) { + public TransactionResultDTO getTransactionByBlockNumberAndIndex(int blockNum, int index) { Block block = wallet.getBlockByNum(blockNum); if (block == null) { return null; @@ -438,17 +429,11 @@ public JSONObject getTransactionByBlockNumberAndIndex(int blockNum, int index) { return null; } Transaction transaction = block.getTransactions(index); - String txid = getTxID(transaction); - TransactionInfo transactionInfo = wallet.getTransactionInfoById( - ByteString.copyFrom(ByteArray.fromHexString(txid))); - if (transactionInfo == null) { - return null; - } - return formatRpcTransaction(transaction, transactionInfo, block); + return formatRpcTransaction(transaction, block); } @Override - public JSONObject getTransactionReceipt(String txid) { + public TransactionReceipt getTransactionReceipt(String txid) { Transaction transaction = wallet .getTransactionById(ByteString.copyFrom(ByteArray.fromHexString(txid))); @@ -460,55 +445,57 @@ public JSONObject getTransactionReceipt(String txid) { long blockNum = transactionInfo.getBlockNumber(); Block block = wallet.getBlockByNum(blockNum); - JSONObject jsonObject = formatRpcTransaction(transaction, transactionInfo, block); - String transactionHash = (String) jsonObject.remove("hash"); - jsonObject.put("transactionHash", transactionHash); - jsonObject.remove("gas"); - jsonObject.remove("gasPrice"); - jsonObject.remove("input"); - jsonObject.remove("nonce"); - jsonObject.remove("value"); - jsonObject.remove("v"); - jsonObject.remove("r"); - jsonObject.remove("s"); + TransactionResultDTO dto = formatRpcTransaction(transaction, block); + TransactionReceipt receipt = new TransactionReceipt(); + receipt.blockHash = dto.blockHash; + receipt.blockNumber = dto.blockNumber; + receipt.transactionIndex = dto.transactionIndex; + receipt.transactionHash = dto.hash; + receipt.from = dto.from; + receipt.fromBase58 = dto.fromBase58; + receipt.to = dto.to; + receipt.toBase58 = dto.toBase58; long cumulativeGasUsed = 0; - TransactionInfoList reply = wallet.getTransactionInfoByBlockNum(blockNum); - for (TransactionInfo info : reply.getTransactionInfoList()) { + TransactionInfoList infoList = wallet.getTransactionInfoByBlockNum(blockNum); + for (TransactionInfo info : infoList.getTransactionInfoList()) { cumulativeGasUsed += info.getFee(); } - jsonObject.put("cumulativeGasUsed", long2HexString(cumulativeGasUsed)); - jsonObject.put("gasUsed", long2HexString(transactionInfo.getFee())); + receipt.cumulativeGasUsed = ByteArray.toJsonHex(cumulativeGasUsed); + receipt.gasUsed = ByteArray.toJsonHex(transactionInfo.getFee()); String contractAddress = null; if (transaction.getRawData().getContract(0).getType() == ContractType.CreateSmartContract) { - contractAddress = StringUtil.encode58Check(generateContractAddress(transaction)); + contractAddress = encode58Check(generateContractAddress(transaction)); } - jsonObject.put("contractAddress", contractAddress); + receipt.contractAddress = contractAddress; //统一的log - JSONArray logArray = new JSONArray(); + List logList = new ArrayList<>(); for (int index = 0; index < transactionInfo.getLogCount(); index++) { TransactionInfo.Log log = transactionInfo.getLogList().get(index); - JSONObject logItem = new JSONObject(true); - logItem.put("logIndex", int2HexString(index + 1)); //log的索引从1开始 - logItem.put("transactionHash", jsonObject.getString("transactionHash")); - logItem.put("transactionIndex", jsonObject.getString("transactionIndex")); - logItem.put("blockHash", jsonObject.getString("blockHash")); - logItem.put("blockNumber", jsonObject.getString("blockNumber")); - logItem.put("address", - StringUtil.encode58Check(convertToTronAddress(log.getAddress().toByteArray()))); - logItem.put("data", "0x" + ByteArray.toHexString(log.getData().toByteArray())); + + TransactionReceipt.TransactionLog transactionLog = new TransactionReceipt.TransactionLog(); + transactionLog.logIndex = ByteArray.toJsonHex(index + 1); //log的索引从1开始 + transactionLog.transactionHash = dto.hash; + transactionLog.transactionIndex = dto.transactionIndex; + transactionLog.blockHash = dto.blockHash; + transactionLog.blockNumber = dto.blockNumber; + byte[] addressByte = convertToTronAddress(log.getAddress().toByteArray()); + transactionLog.address = ByteArray.toJsonHex(addressByte); + transactionLog.addressBase58 = encode58Check(addressByte); + transactionLog.data = ByteArray.toJsonHex(log.getData().toByteArray()); String[] topics = new String[log.getTopicsCount()]; for (int i = 0; i < log.getTopicsCount(); i++) { - topics[i] = "0x" + ByteArray.toHexString(log.getTopics(i).toByteArray()); + topics[i] = ByteArray.toJsonHex(log.getTopics(i).toByteArray()); } - logItem.put("topics", topics); - logArray.add(logItem); + transactionLog.topics = topics; + + logList.add(transactionLog); } - jsonObject.put("logs", logArray); - jsonObject.put("logsBloom", ""); //暂时不填 + receipt.logs = logList.toArray(new TransactionReceipt.TransactionLog[logList.size()]); + receipt.logsBloom = null; //暂时不填 - return jsonObject; + return receipt; } } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java new file mode 100644 index 00000000000..e8f9b2eef75 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java @@ -0,0 +1,41 @@ +package org.tron.core.services.jsonrpc; + +public class TransactionReceipt { + + public static class TransactionLog { + + public String logIndex; + public String blockHash; + public String blockNumber; + public String transactionIndex; + public String transactionHash; + public String address; + public String addressBase58; + public String data; + public String[] topics; + + public TransactionLog() { + + } + } + + public String blockHash; + public String blockNumber; + public String transactionIndex; + public String transactionHash; + public String from; + public String fromBase58; + public String to; + public String toBase58; + + public String cumulativeGasUsed; + public String gasUsed; + public String contractAddress; + public String contractAddressBase58; + public TransactionLog[] logs; + public String logsBloom; + + public TransactionReceipt() { + + } +} diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResultDTO.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResultDTO.java index c67fb6d0acc..97bee1afb7b 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResultDTO.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResultDTO.java @@ -1,8 +1,11 @@ package org.tron.core.services.jsonrpc; -import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTransactionAmount; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.encode58Check; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getToAddress; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTransactionAmount; +import com.google.protobuf.ByteString; +import java.util.Arrays; import lombok.Value; import org.tron.common.utils.ByteArray; import org.tron.core.Wallet; @@ -22,12 +25,18 @@ public class TransactionResultDTO { public String transactionIndex; public String from; + public String fromBase58; public String to; + public String toBase58; public String gas; public String gasPrice; public String value; public String input; + public String v; + public String r; + public String s; + public TransactionResultDTO(Block b, int index, Transaction tx, Wallet wallet) { BlockCapsule blockCapsule = new BlockCapsule(b); @@ -40,19 +49,33 @@ public TransactionResultDTO(Block b, int index, Transaction tx, Wallet wallet) { if (!tx.getRawData().getContractList().isEmpty()) { Contract contract = tx.getRawData().getContract(0); - from = ByteArray.toJsonHex(TransactionCapsule.getOwner(contract)); - to = ByteArray.toJsonHex(getToAddress(tx)); + byte[] fromByte = TransactionCapsule.getOwner(contract); + byte[] toByte = getToAddress(tx); + from = ByteArray.toJsonHex(fromByte); + to = ByteArray.toJsonHex(toByte); + fromBase58 = encode58Check(fromByte); + toBase58 = encode58Check(toByte); value = ByteArray.toJsonHex(getTransactionAmount(contract, hash, wallet)); } else { from = ""; to = ""; + fromBase58 = ""; + toBase58 = ""; value = ""; } gas = ""; gasPrice = ""; - input = ""; + + ByteString signature = tx.getSignature(0); // r[32] + s[32] + 符号位v[1] + byte[] signData = signature.toByteArray(); + byte vByte = (byte) (signData[64] + 27); //参考函数 Base64toBytes + byte[] rByte = Arrays.copyOfRange(signData, 0, 32); + byte[] sByte = Arrays.copyOfRange(signData, 32, 64); + v = ByteArray.toJsonHex(vByte); + r = ByteArray.toJsonHex(rByte); + s = ByteArray.toJsonHex(sByte); } @Override From 14c482b73443db63891bfbc955f3adeffd098f2e Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Thu, 3 Jun 2021 12:05:02 +0800 Subject: [PATCH 020/341] delete getOwner from JsonRpcApiUtil --- .../core/services/jsonrpc/JsonRpcApiUtil.java | 156 ------------------ 1 file changed, 156 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index f615da8b8b5..9a503200962 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -8,12 +8,10 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import java.util.Optional; import lombok.extern.slf4j.Slf4j; import org.spongycastle.util.encoders.Hex; import org.tron.api.GrpcAPI.AssetIssueList; import org.tron.common.crypto.Hash; -import org.tron.common.utils.Base58; import org.tron.common.utils.ByteArray; import org.tron.common.utils.Commons; import org.tron.common.utils.Sha256Hash; @@ -26,40 +24,26 @@ import org.tron.protos.Protocol.Transaction.Contract.ContractType; import org.tron.protos.Protocol.TransactionInfo; import org.tron.protos.contract.AccountContract.AccountCreateContract; -import org.tron.protos.contract.AccountContract.AccountPermissionUpdateContract; -import org.tron.protos.contract.AccountContract.AccountUpdateContract; -import org.tron.protos.contract.AccountContract.SetAccountIdContract; import org.tron.protos.contract.AssetIssueContractOuterClass.AssetIssueContract; import org.tron.protos.contract.AssetIssueContractOuterClass.AssetIssueContract.FrozenSupply; import org.tron.protos.contract.AssetIssueContractOuterClass.ParticipateAssetIssueContract; import org.tron.protos.contract.AssetIssueContractOuterClass.TransferAssetContract; import org.tron.protos.contract.AssetIssueContractOuterClass.UnfreezeAssetContract; -import org.tron.protos.contract.AssetIssueContractOuterClass.UpdateAssetContract; import org.tron.protos.contract.BalanceContract.FreezeBalanceContract; import org.tron.protos.contract.BalanceContract.TransferContract; import org.tron.protos.contract.BalanceContract.UnfreezeBalanceContract; -import org.tron.protos.contract.BalanceContract.WithdrawBalanceContract; -import org.tron.protos.contract.ExchangeContract.ExchangeCreateContract; import org.tron.protos.contract.ExchangeContract.ExchangeInjectContract; import org.tron.protos.contract.ExchangeContract.ExchangeTransactionContract; import org.tron.protos.contract.ExchangeContract.ExchangeWithdrawContract; -import org.tron.protos.contract.MarketContract.MarketCancelOrderContract; -import org.tron.protos.contract.MarketContract.MarketSellAssetContract; -import org.tron.protos.contract.ProposalContract.ProposalApproveContract; -import org.tron.protos.contract.ProposalContract.ProposalCreateContract; -import org.tron.protos.contract.ProposalContract.ProposalDeleteContract; import org.tron.protos.contract.ShieldContract.ShieldedTransferContract; import org.tron.protos.contract.SmartContractOuterClass.ClearABIContract; import org.tron.protos.contract.SmartContractOuterClass.CreateSmartContract; import org.tron.protos.contract.SmartContractOuterClass.TriggerSmartContract; import org.tron.protos.contract.SmartContractOuterClass.UpdateEnergyLimitContract; import org.tron.protos.contract.SmartContractOuterClass.UpdateSettingContract; -import org.tron.protos.contract.StorageContract.UpdateBrokerageContract; import org.tron.protos.contract.VoteAssetContractOuterClass.VoteAssetContract; import org.tron.protos.contract.WitnessContract.VoteWitnessContract; import org.tron.protos.contract.WitnessContract.VoteWitnessContract.Vote; -import org.tron.protos.contract.WitnessContract.WitnessCreateContract; -import org.tron.protos.contract.WitnessContract.WitnessUpdateContract; @Slf4j(topic = "API") public class JsonRpcApiUtil { @@ -181,138 +165,6 @@ public static String getBlockID(Block block) { return "0x" + ByteArray.toHexString(hash); } - public static byte[] getOwner(Transaction.Contract contract) { - ByteString owner = null; - try { - Any contractParameter = contract.getParameter(); - switch (contract.getType()) { - case AccountCreateContract: - owner = contractParameter.unpack(AccountCreateContract.class).getOwnerAddress(); - break; - case AccountUpdateContract: - owner = contractParameter.unpack(AccountUpdateContract.class).getOwnerAddress(); - break; - case SetAccountIdContract: - owner = contractParameter.unpack(SetAccountIdContract.class).getOwnerAddress(); - break; - case TransferContract: - owner = contractParameter.unpack(TransferContract.class).getOwnerAddress(); - break; - case TransferAssetContract: - owner = contractParameter.unpack(TransferAssetContract.class).getOwnerAddress(); - break; - case VoteAssetContract: - owner = contractParameter.unpack(VoteAssetContract.class).getOwnerAddress(); - break; - case VoteWitnessContract: - owner = contractParameter.unpack(VoteWitnessContract.class).getOwnerAddress(); - break; - case WitnessCreateContract: - owner = contractParameter.unpack(WitnessCreateContract.class).getOwnerAddress(); - break; - case AssetIssueContract: - owner = contractParameter.unpack(AssetIssueContract.class).getOwnerAddress(); - break; - case WitnessUpdateContract: - owner = contractParameter.unpack(WitnessUpdateContract.class).getOwnerAddress(); - break; - case ParticipateAssetIssueContract: - owner = contractParameter.unpack(ParticipateAssetIssueContract.class).getOwnerAddress(); - break; - case FreezeBalanceContract: - owner = contractParameter.unpack(FreezeBalanceContract.class).getOwnerAddress(); - break; - case UnfreezeBalanceContract: - owner = contractParameter.unpack(UnfreezeBalanceContract.class).getOwnerAddress(); - break; - case UnfreezeAssetContract: - owner = contractParameter.unpack(UnfreezeAssetContract.class).getOwnerAddress(); - break; - case WithdrawBalanceContract: - owner = contractParameter.unpack(WithdrawBalanceContract.class).getOwnerAddress(); - break; - case CreateSmartContract: - owner = contractParameter.unpack(CreateSmartContract.class).getOwnerAddress(); - break; - case TriggerSmartContract: - owner = contractParameter.unpack(TriggerSmartContract.class).getOwnerAddress(); - break; - case UpdateAssetContract: - owner = contractParameter.unpack(UpdateAssetContract.class).getOwnerAddress(); - break; - case ProposalCreateContract: - owner = contractParameter.unpack(ProposalCreateContract.class).getOwnerAddress(); - break; - case ProposalApproveContract: - owner = contractParameter.unpack(ProposalApproveContract.class).getOwnerAddress(); - break; - case ProposalDeleteContract: - owner = contractParameter.unpack(ProposalDeleteContract.class).getOwnerAddress(); - break; - // case BuyStorageContract: - // owner = contractParameter.unpack(BuyStorageContract.class).getOwnerAddress(); - // break; - // case BuyStorageBytesContract: - // owner = contractParameter.unpack(BuyStorageBytesContract.class).getOwnerAddress(); - // break; - // case SellStorageContract: - // owner = contractParameter.unpack(SellStorageContract.class).getOwnerAddress(); - // break; - case UpdateSettingContract: - owner = contractParameter.unpack(UpdateSettingContract.class) - .getOwnerAddress(); - break; - case ExchangeCreateContract: - owner = contractParameter.unpack(ExchangeCreateContract.class).getOwnerAddress(); - break; - case ExchangeInjectContract: - owner = contractParameter.unpack(ExchangeInjectContract.class).getOwnerAddress(); - break; - case ExchangeWithdrawContract: - owner = contractParameter.unpack(ExchangeWithdrawContract.class).getOwnerAddress(); - break; - case ExchangeTransactionContract: - owner = contractParameter.unpack(ExchangeTransactionContract.class).getOwnerAddress(); - break; - case UpdateEnergyLimitContract: - owner = contractParameter.unpack(UpdateEnergyLimitContract.class).getOwnerAddress(); - break; - case AccountPermissionUpdateContract: - owner = contractParameter.unpack(AccountPermissionUpdateContract.class).getOwnerAddress(); - break; - case ClearABIContract: - owner = contractParameter.unpack(ClearABIContract.class).getOwnerAddress(); - break; - case UpdateBrokerageContract: - owner = contractParameter.unpack(UpdateBrokerageContract.class) - .getOwnerAddress(); - break; - case ShieldedTransferContract: - owner = contractParameter.unpack(ShieldedTransferContract.class) - .getTransparentFromAddress(); - break; - case MarketSellAssetContract: - owner = contractParameter.unpack(MarketSellAssetContract.class) - .getOwnerAddress(); - break; - case MarketCancelOrderContract: - owner = contractParameter.unpack(MarketCancelOrderContract.class) - .getOwnerAddress(); - break; - default: - return null; - } - return owner.toByteArray(); - } catch (Exception ex) { - ex.printStackTrace(); - } catch (Throwable t) { - //捕获unpack抛出的java.lang.NoClassDefFoundError,否则线程中断。上一个不能捕获 - t.printStackTrace(); - } - - return owner == null ? null : owner.toByteArray(); - } - public static byte[] getToAddress(Transaction transaction) { List toAddressList = getTo(transaction); if (!toAddressList.isEmpty()) { @@ -634,12 +486,4 @@ public static long getUnfreezeAssetAmount(byte[] addressBytes, Wallet wallet) { } return amount; } - - public static String int2HexString(int i) { - return "0x" + Integer.toUnsignedString(i, 16); - } - - public static String long2HexString(long l) { - return "0x" + Long.toUnsignedString(l, 16); - } } From e3c79f250b011ee71a174adfc393c35434b82d31 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 3 Jun 2021 17:09:49 +0800 Subject: [PATCH 021/341] feat: add empty ethCall --- .../core/services/jsonrpc/TestService.java | 31 +++++++++++++++++++ .../services/jsonrpc/TestServiceImpl.java | 5 +++ 2 files changed, 36 insertions(+) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java index e86e8fdffb3..4df5325fc58 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java @@ -4,11 +4,39 @@ import com.googlecode.jsonrpc4j.JsonRpcMethod; import java.math.BigInteger; import java.util.Arrays; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; import org.springframework.stereotype.Component; import org.tron.core.exception.ItemNotFoundException; @Component public interface TestService { + + @NoArgsConstructor + @AllArgsConstructor + class CallArguments { + public String from; + public String to; + public String gas; + public String gasPrice; + public String value; + public String data; // compiledCode + public String nonce; + + @Override + public String toString() { + return "CallArguments{" + + "from='" + from + '\'' + + ", to='" + to + '\'' + + ", gas='" + gas + '\'' + + ", gasPrice='" + gasPrice + '\'' + + ", value='" + value + '\'' + + ", data='" + data + '\'' + + ", nonce='" + nonce + '\'' + + '}'; + } + } + class BlockResult { public String number; public String hash; @@ -74,6 +102,9 @@ public String toString() { @JsonRpcMethod("eth_getBlockByNumber") BlockResult ethGetBlockByNumber(String bnOrId, Boolean fullTransactionObjects) throws Exception; + @JsonRpcMethod("eth_call") + String ethCall(CallArguments args, String bnOrId) throws Exception; + @JsonRpcMethod("net_version") int getNetVersion(); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java index 69eb8503803..78587899db9 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java @@ -13,6 +13,7 @@ import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.regex.Matcher; @@ -169,6 +170,10 @@ protected BlockResult getBlockResult(Block block, boolean fullTx) { return br; } + public String ethCall(CallArguments args, String bnOrId) throws Exception { + return ""; + } + @Override public int getNetVersion() { //当前链的id,不能跟metamask已有的id冲突 From de879039532c2b6d421783db2f524b462dd26b23 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Thu, 3 Jun 2021 17:12:12 +0800 Subject: [PATCH 022/341] add eth_Call --- .../core/services/jsonrpc/JsonRpcApiUtil.java | 2 + .../core/services/jsonrpc/TestService.java | 24 ++++ .../services/jsonrpc/TestServiceImpl.java | 136 ++++++++++++++++-- .../services/jsonrpc/TransactionCall.java | 21 +++ 4 files changed, 169 insertions(+), 14 deletions(-) create mode 100644 framework/src/main/java/org/tron/core/services/jsonrpc/TransactionCall.java diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index 9a503200962..a6547c2815b 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -48,6 +48,8 @@ @Slf4j(topic = "API") public class JsonRpcApiUtil { + public static String balanceOfTopic = getMethodSign("balanceOf(address)"); + // transform the Tron address to Ethereum Address public static String tronToEthAddress(String tronAddress) { byte[] tronBytes = Commons.decodeFromBase58Check(tronAddress); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java index e86e8fdffb3..383bbc1570a 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java @@ -4,12 +4,16 @@ import com.googlecode.jsonrpc4j.JsonRpcMethod; import java.math.BigInteger; import java.util.Arrays; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; import org.springframework.stereotype.Component; import org.tron.core.exception.ItemNotFoundException; @Component public interface TestService { + class BlockResult { + public String number; public String hash; public String parentHash; @@ -56,6 +60,23 @@ public String toString() { } } + @NoArgsConstructor + @AllArgsConstructor + class TransactionCall { + + String from; + String to; + String gas; //无用 + String gasPrice; //无用 + String value; //无用 + String data; + + public String toString() { + return String.format("{\"from\":\"%s\", \"to\":\"%s\", \"gas\":\"0\", \"gasPrice\":\"0\", " + + "\"value\":\"0\", \"data\":\"%s\"}", from, to, data); + } + } + @JsonRpcMethod("web3_clientVersion") String web3ClientVersion(); @@ -124,4 +145,7 @@ public String toString() { @JsonRpcMethod("eth_gettransactionreceipt") TransactionReceipt getTransactionReceipt(String txid); + + @JsonRpcMethod("eth_call") + String getCall(TransactionCall transactionCall, String blockNumOrTag); } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java index 69eb8503803..dbf86c8f188 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java @@ -2,6 +2,7 @@ import static org.tron.core.Wallet.CONTRACT_VALIDATE_ERROR; import static org.tron.core.Wallet.CONTRACT_VALIDATE_EXCEPTION; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.balanceOfTopic; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.convertToTronAddress; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.encode58Check; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.generateContractAddress; @@ -51,8 +52,8 @@ public class TestServiceImpl implements TestService { private NodeInfoService nodeInfoService; private Wallet wallet; -// public TestServiceImpl() { -// } + public TestServiceImpl() { + } public TestServiceImpl(NodeInfoService nodeInfoService, Wallet wallet) { this.nodeInfoService = nodeInfoService; @@ -201,19 +202,22 @@ public long getTrxBalance(String address, String blockNumOrTag) throws ItemNotFo return wallet.getAccount(account).getBalance(); } - @Override - public BigInteger getTrc20Balance(String ownerAddress, String contractAddress, - String blockNumOrTag) { - //某个用户拥有的某个token20余额,带精度 - byte[] addressData = Commons.decodeFromBase58Check(ownerAddress); - byte[] addressDataWord = new byte[32]; - System.arraycopy(addressData, 0, addressDataWord, 32 - addressData.length, addressData.length); - String dataStr = getMethodSign("balanceOf(address)") + Hex.toHexString(addressDataWord); + + /** + * @param data Hash of the method signature and encoded parameters. + * for example: getMethodSign(methodName(uint256,uint256)) || data1 || data2 + */ + private String call(byte[] ownerAddressByte, byte[] contractAddressByte, byte[] data) { //构造静态合约时,只需要3个字段 - TriggerSmartContract triggerContract = triggerCallContract(addressData, - Commons.decodeFromBase58Check(contractAddress), 0, - ByteArray.fromHexString(dataStr), 0, null); + TriggerSmartContract triggerContract = triggerCallContract( + ownerAddressByte, + contractAddressByte, + 0, //给合约发送的trx,静态合约不需要 + data, + 0, //给合约发送的 token10 的金额,静态合约不需要 + null //给合约发送的 token10 ID,静态合约不需要 + ); TransactionExtention.Builder trxExtBuilder = TransactionExtention.newBuilder(); Return.Builder retBuilder = Return.newBuilder(); @@ -261,8 +265,76 @@ public BigInteger getTrc20Balance(String ownerAddress, String contractAddress, } result = Hex.toHexString(listBytes); } else { - logger.error("trigger contract to get scaling factor error."); + logger.error("trigger contract failed."); } + return result; + } + + @Override + public BigInteger getTrc20Balance(String ownerAddress, String contractAddress, + String blockNumOrTag) { + //某个用户拥有的某个token20余额,带精度 + byte[] addressData = Commons.decodeFromBase58Check(ownerAddress); + byte[] addressDataWord = new byte[32]; + System.arraycopy(addressData, 0, addressDataWord, 32 - addressData.length, addressData.length); + String dataStr = balanceOfTopic + Hex.toHexString(addressDataWord); + + String result = call(addressData, Commons.decodeFromBase58Check(contractAddress), + ByteArray.fromHexString(dataStr)); + +// //构造静态合约时,只需要3个字段 +// TriggerSmartContract triggerContract = triggerCallContract(addressData, +// Commons.decodeFromBase58Check(contractAddress), 0, +// ByteArray.fromHexString(dataStr), 0, null); +// +// TransactionExtention.Builder trxExtBuilder = TransactionExtention.newBuilder(); +// Return.Builder retBuilder = Return.newBuilder(); +// TransactionExtention trxExt; +// +// try { +// TransactionCapsule trxCap = wallet.createTransactionCapsule(triggerContract, +// ContractType.TriggerSmartContract); +// Transaction trx = wallet.triggerConstantContract( +// triggerContract, +// trxCap, +// trxExtBuilder, +// retBuilder); +// +// retBuilder.setResult(true).setCode(response_code.SUCCESS); +// trxExtBuilder.setTransaction(trx); +// trxExtBuilder.setTxid(trxCap.getTransactionId().getByteString()); +// trxExtBuilder.setResult(retBuilder); +// } catch (ContractValidateException | VMIllegalException e) { +// retBuilder.setResult(false).setCode(response_code.CONTRACT_VALIDATE_ERROR) +// .setMessage(ByteString.copyFromUtf8(CONTRACT_VALIDATE_ERROR + e.getMessage())); +// trxExtBuilder.setResult(retBuilder); +// logger.warn(CONTRACT_VALIDATE_EXCEPTION, e.getMessage()); +// } catch (RuntimeException e) { +// retBuilder.setResult(false).setCode(response_code.CONTRACT_EXE_ERROR) +// .setMessage(ByteString.copyFromUtf8(e.getClass() + " : " + e.getMessage())); +// trxExtBuilder.setResult(retBuilder); +// logger.warn("When run constant call in VM, have RuntimeException: " + e.getMessage()); +// } catch (Exception e) { +// retBuilder.setResult(false).setCode(response_code.OTHER_ERROR) +// .setMessage(ByteString.copyFromUtf8(e.getClass() + " : " + e.getMessage())); +// trxExtBuilder.setResult(retBuilder); +// logger.warn("Unknown exception caught: " + e.getMessage(), e); +// } finally { +// trxExt = trxExtBuilder.build(); +// } +// +// String result = null; +// String code = trxExt.getResult().getCode().toString(); +// if ("SUCCESS".equals(code)) { +// List list = trxExt.getConstantResultList(); +// byte[] listBytes = new byte[0]; +// for (ByteString bs : list) { +// listBytes = ByteUtil.merge(listBytes, bs.toByteArray()); +// } +// result = Hex.toHexString(listBytes); +// } else { +// logger.error("trigger contract to get scaling factor error."); +// } if (Objects.isNull(result)) { return BigInteger.valueOf(0); @@ -498,4 +570,40 @@ public TransactionReceipt getTransactionReceipt(String txid) { return receipt; } + + @Override + public String getCall(TransactionCall transactionCall, String blockNumOrTag) { + //静态调用合约方法。 + byte[] addressData = Commons.decodeFromBase58Check(transactionCall.from); + byte[] contractAddressData = Commons.decodeFromBase58Check(transactionCall.to); + + return call(addressData, contractAddressData, ByteArray.fromHexString(transactionCall.data)); + } + + public void testGetCall() { + String ownerAddress = "TXvRyjomvtNWSKvNouTvAedRGD4w9RXLZD"; + String usdjAddress = "TLBaRhANQoJFTqre9Nf1mjuwNWjCJeYqUL"; // nile测试环境udsj地址 + + byte[] addressData = Commons.decodeFromBase58Check(ownerAddress); + byte[] addressDataWord = new byte[32]; + System.arraycopy(Commons.decodeFromBase58Check(ownerAddress), 0, addressDataWord, + 32 - addressData.length, addressData.length); + String dataStr = balanceOfTopic + Hex.toHexString(addressDataWord); + String data = getMethodSign("balanceOf(address)") + dataStr; + + TransactionCall transactionCall = new TransactionCall(); + transactionCall.from = ownerAddress; + transactionCall.to = usdjAddress; + transactionCall.data = data; + + StringBuffer sb = new StringBuffer("{\"jsonrpc\":\"2.0\",\"method\":\"eth_call\",\"params\":["); + sb.append(transactionCall); + sb.append(", \"latest\"],\"id\":1}"); + System.out.println(sb); + } + + public static void main(String[] args) { + TestServiceImpl impl = new TestServiceImpl(); + impl.testGetCall(); + } } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionCall.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionCall.java new file mode 100644 index 00000000000..37ed99634ad --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionCall.java @@ -0,0 +1,21 @@ +package org.tron.core.services.jsonrpc; + +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +public class TransactionCall { + + String from; + String to; + String gas; //无用 + String gasPrice; //无用 + String value; //无用 + String data; + + public String toString() { + return String.format("{\"from\":\"%s\", \"to\":\"%s\", \"gas\":\"0\", \"gasPrice\":\"0\", " + + "\"value\":\"0\", \"data\":\"%s\"}", from, to, data); + } +} From 56a4967911ad18eb1955cb7e3743d14f56cdea2d Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Fri, 4 Jun 2021 16:14:44 +0800 Subject: [PATCH 023/341] add net_peerCount, eth_syncing, eth_hashrate, eth_mining, and 4 uncle jsonrpc api --- .../core/services/jsonrpc/TestService.java | 28 +++++++- .../services/jsonrpc/TestServiceImpl.java | 67 ++++++++++++++++++- 2 files changed, 92 insertions(+), 3 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java index b5548bcc79e..e30b86dd868 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java @@ -10,6 +10,7 @@ public interface TestService { class BlockResult { + public String number; public String hash; public String parentHash; @@ -27,7 +28,7 @@ class BlockResult { public String gasLimit; public String gasUsed; public String timestamp; - public Object[] transactions; //one of TransactionResultDTO、byte32 + public Object[] transactions; //TransactionResultDTO or byte32 public String[] uncles; @Override @@ -127,4 +128,29 @@ public String toString() { @JsonRpcMethod("eth_call") String getCall(TransactionCall transactionCall, String blockNumOrTag); + + @JsonRpcMethod("net_peerCount") + int getPeerCount(); + + @JsonRpcMethod("eth_syncing") + Object getSyncingStatus(); + + @JsonRpcMethod("eth_getUncleByBlockHashAndIndex") + BlockResult getUncleByBlockHashAndIndex(String blockHash, int index); + + @JsonRpcMethod("eth_getUncleByBlockNumberAndIndex") + BlockResult getUncleByBlockNumberAndIndex(String blockNumOrTag, int index); + + @JsonRpcMethod("eth_getUncleCountByBlockHash") + int getUncleCountByBlockHash(String blockHash); + + @JsonRpcMethod("eth_getUncleCountByBlockNumber") + int getUncleCountByBlockNumber(String blockNumOrTag); + + @JsonRpcMethod("eth_hashrate") + int getHashRate(); + + @JsonRpcMethod("eth_mining") + boolean isMining(); + } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java index fa3c5c15d2d..2a2e2c51e74 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java @@ -10,6 +10,7 @@ import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTxID; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.triggerCallContract; +import com.alibaba.fastjson.JSONObject; import com.google.protobuf.ByteString; import java.math.BigInteger; import java.util.ArrayList; @@ -492,7 +493,8 @@ public String getCall(TransactionCall transactionCall, String blockNumOrTag) { return call(addressData, contractAddressData, ByteArray.fromHexString(transactionCall.data)); } - public void testGetCall() { + //生成一个调用call api的参数,可以自由修改 + private void generateCallParameter() { String ownerAddress = "TXvRyjomvtNWSKvNouTvAedRGD4w9RXLZD"; String usdjAddress = "TLBaRhANQoJFTqre9Nf1mjuwNWjCJeYqUL"; // nile测试环境udsj地址 @@ -513,8 +515,69 @@ public void testGetCall() { System.out.println(sb); } + @Override + public int getPeerCount() { + //返回当前节点所连接的peer节点数量 + return nodeInfoService.getNodeInfo().getPeerList().size(); + } + + @Override + public Object getSyncingStatus() { + //查询同步状态。未同步返回false,否则返回JSonObject + if (nodeInfoService.getNodeInfo().getPeerList().size() == 0) { + return false; + } + long startingBlock = nodeInfoService.getNodeInfo().getBeginSyncNum(); + long currentBlock = getLatestBlockNum(); + long diff = (System.currentTimeMillis() - wallet.getNowBlock().getBlockHeader().getRawData() + .getTimestamp()) / 3000; + diff = diff > 0 ? diff : 0; + long highestBlock = currentBlock + diff; //预测的最高块号 + JSONObject jsonObject = new JSONObject(true); + jsonObject.put("startingBlock", startingBlock); + jsonObject.put("currentBlock", currentBlock); + jsonObject.put("highestBlock", highestBlock); + return jsonObject; + } + + @Override + public BlockResult getUncleByBlockHashAndIndex(String blockHash, int index) { + //查询指定块hash的第几个分叉 + return null; + } + + @Override + public BlockResult getUncleByBlockNumberAndIndex(String blockNumOrTag, int index) { + //查询指定块号的第几个分叉 + return null; + } + + @Override + public int getUncleCountByBlockHash(String blockHash) { + //查询指定块hash的分叉个数 + return 0; + } + + @Override + public int getUncleCountByBlockNumber(String blockNumOrTag) { + //查询指定块号的分叉个数 + return 0; + } + + @Override + public int getHashRate() { + //读取当前挖矿节点的每秒钟哈希值算出数量,无用 + return 0; + } + + @Override + public boolean isMining() { + //检查节点是否在进行挖矿,无用 + return false; + } + public static void main(String[] args) { TestServiceImpl impl = new TestServiceImpl(); - impl.testGetCall(); + impl.generateCallParameter(); } } From fc209d4c2e2aa269245d0b79be340ccbf2fa0f58 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Fri, 4 Jun 2021 16:53:53 +0800 Subject: [PATCH 024/341] rename jsonrpc --- .../jsonrpc/FullNodeJsonRpcStreamService.java | 11 +- .../core/services/jsonrpc/JsonRpcServlet.java | 6 +- .../core/services/jsonrpc/TestService.java | 156 --------- .../services/jsonrpc/TransactionCall.java | 32 -- .../services/jsonrpc/TransactionReceipt.java | 41 --- .../jsonrpc/TransactionResultDTO.java | 97 ------ .../core/services/jsonrpc/TronJsonRpc.java | 327 ++++++++++++++++++ ...tServiceImpl.java => TronJsonRpcImpl.java} | 39 +-- 8 files changed, 352 insertions(+), 357 deletions(-) delete mode 100644 framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java delete mode 100644 framework/src/main/java/org/tron/core/services/jsonrpc/TransactionCall.java delete mode 100644 framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java delete mode 100644 framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResultDTO.java create mode 100644 framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java rename framework/src/main/java/org/tron/core/services/jsonrpc/{TestServiceImpl.java => TronJsonRpcImpl.java} (94%) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcStreamService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcStreamService.java index b7a96bb7097..7a61afdbd9a 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcStreamService.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcStreamService.java @@ -3,20 +3,15 @@ import com.googlecode.jsonrpc4j.JsonRpcServer; import com.googlecode.jsonrpc4j.ProxyUtil; import com.googlecode.jsonrpc4j.StreamServer; -import java.io.IOException; import java.net.InetAddress; import java.net.ServerSocket; import javax.net.ServerSocketFactory; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.tron.common.application.Service; import org.tron.common.parameter.CommonParameter; import org.tron.core.Wallet; -import org.tron.core.config.args.Args; import org.tron.core.services.NodeInfoService; @Component @@ -26,7 +21,7 @@ public class FullNodeJsonRpcStreamService implements Service { private int port = 8099; private JsonRpcServer jsonRpcServer; - private TestServiceImpl testServiceImpl; + private TronJsonRpcImpl testServiceImpl; private StreamServer streamServer; @Autowired @@ -44,12 +39,12 @@ public void init(CommonParameter args) { @Override public void start() { - testServiceImpl = new TestServiceImpl(nodeInfoService, wallet); + testServiceImpl = new TronJsonRpcImpl(nodeInfoService, wallet); Object compositeService = ProxyUtil.createCompositeServiceProxy( this.getClass().getClassLoader(), new Object[] {testServiceImpl}, - new Class[] {TestService.class}, + new Class[] {TronJsonRpc.class}, true); jsonRpcServer = new JsonRpcServer(compositeService); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java index fb869377ac4..9be2054ce82 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java @@ -20,7 +20,7 @@ public class JsonRpcServlet extends RateLimiterServlet { private static final long serialVersionUID = 12341234345L; private JsonRpcServer rpcServer = null; - private TestServiceImpl testServiceImpl; + private TronJsonRpcImpl testServiceImpl; @Autowired private NodeInfoService nodeInfoService; @@ -30,11 +30,11 @@ public class JsonRpcServlet extends RateLimiterServlet { // @Override public void init(ServletConfig config) throws ServletException { super.init(config); - testServiceImpl = new TestServiceImpl(nodeInfoService, wallet); + testServiceImpl = new TronJsonRpcImpl(nodeInfoService, wallet); Object compositeService = ProxyUtil.createCompositeServiceProxy( this.getClass().getClassLoader(), new Object[] {testServiceImpl}, - new Class[] {TestService.class}, + new Class[] {TronJsonRpc.class}, true); rpcServer = new JsonRpcServer(compositeService); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java deleted file mode 100644 index e30b86dd868..00000000000 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestService.java +++ /dev/null @@ -1,156 +0,0 @@ -package org.tron.core.services.jsonrpc; - -import com.googlecode.jsonrpc4j.JsonRpcMethod; -import java.math.BigInteger; -import java.util.Arrays; -import org.springframework.stereotype.Component; -import org.tron.core.exception.ItemNotFoundException; - -@Component -public interface TestService { - - class BlockResult { - - public String number; - public String hash; - public String parentHash; - public String nonce; - public String sha3Uncles; - public String logsBloom; - public String transactionsRoot; - public String stateRoot; - public String receiptsRoot; - public String miner; - public String difficulty; - public String totalDifficulty; - public String extraData; - public String size; - public String gasLimit; - public String gasUsed; - public String timestamp; - public Object[] transactions; //TransactionResultDTO or byte32 - public String[] uncles; - - @Override - public String toString() { - return "BlockResult{" - + "number='" + number + '\'' - + ", hash='" + hash + '\'' - + ", parentHash='" + parentHash + '\'' - + ", nonce='" + nonce + '\'' - + ", sha3Uncles='" + sha3Uncles + '\'' - + ", logsBloom='" + logsBloom + '\'' - + ", transactionsRoot='" + transactionsRoot + '\'' - + ", stateRoot='" + stateRoot + '\'' - + ", receiptsRoot='" + receiptsRoot + '\'' - + ", miner='" + miner + '\'' - + ", difficulty='" + difficulty + '\'' - + ", totalDifficulty='" + totalDifficulty + '\'' - + ", extraData='" + extraData + '\'' - + ", size='" + size + '\'' - + ", gas='" + gasLimit + '\'' - + ", gasUsed='" + gasUsed + '\'' - + ", timestamp='" + timestamp + '\'' - + ", transactions=" + Arrays.toString(transactions) - + ", uncles=" + Arrays.toString(uncles) - + '}'; - } - } - - @JsonRpcMethod("web3_clientVersion") - String web3ClientVersion(); - - @JsonRpcMethod("web3_sha3") - String web3Sha3(String data) throws Exception; - - @JsonRpcMethod("eth_getBlockTransactionCountByHash") - String ethGetBlockTransactionCountByHash(String blockHash) throws Exception; - - @JsonRpcMethod("eth_getBlockTransactionCountByNumber") - String ethGetBlockTransactionCountByNumber(String bnOrId) throws Exception; - - @JsonRpcMethod("eth_getBlockByHash") - BlockResult ethGetBlockByHash(String blockHash, Boolean fullTransactionObjects) throws Exception; - - @JsonRpcMethod("eth_getBlockByNumber") - BlockResult ethGetBlockByNumber(String bnOrId, Boolean fullTransactionObjects) throws Exception; - - @JsonRpcMethod("net_version") - int getNetVersion(); - - @JsonRpcMethod("net_listening") - boolean isListening(); - - @JsonRpcMethod("eth_protocolVersion") - int getProtocolVersion(); - - @JsonRpcMethod("eth_blockNumber") - int getLatestBlockNum(); - - @JsonRpcMethod("eth_getBalance") - long getTrxBalance(String address, String blockNumOrTag) throws ItemNotFoundException; - - @JsonRpcMethod("eth_getStorageAt") - BigInteger getTrc20Balance(String address, String contractAddress, String blockNumOrTag); - - @JsonRpcMethod("eth_getTransactionCount") - long getSendTransactionCountOfAddress(String address, String blockNumOrTag); - - @JsonRpcMethod("eth_getCode") - String getABIofSmartContract(String contractAddress); - - @JsonRpcMethod("eth_syncing") - Object isSyncing(); - - @JsonRpcMethod("eth_coinbase") - String getCoinbase(); - - @JsonRpcMethod("eth_gasPrice") - String gasPrice(); - - @JsonRpcMethod("eth_estimateGas") - String estimateGas(); - - @JsonRpcMethod("eth_getCompilers") - String[] getCompilers(); - - @JsonRpcMethod("eth_getTransactionByHash") - TransactionResultDTO getTransactionByHash(String txid); - - @JsonRpcMethod("eth_getTransactionByBlockHashAndIndex") - TransactionResultDTO getTransactionByBlockHashAndIndex(String blockHash, int index); - - @JsonRpcMethod("eth_getTransactionByBlockNumberAndIndex") - TransactionResultDTO getTransactionByBlockNumberAndIndex(int blockNum, int index); - - @JsonRpcMethod("eth_gettransactionreceipt") - TransactionReceipt getTransactionReceipt(String txid); - - @JsonRpcMethod("eth_call") - String getCall(TransactionCall transactionCall, String blockNumOrTag); - - @JsonRpcMethod("net_peerCount") - int getPeerCount(); - - @JsonRpcMethod("eth_syncing") - Object getSyncingStatus(); - - @JsonRpcMethod("eth_getUncleByBlockHashAndIndex") - BlockResult getUncleByBlockHashAndIndex(String blockHash, int index); - - @JsonRpcMethod("eth_getUncleByBlockNumberAndIndex") - BlockResult getUncleByBlockNumberAndIndex(String blockNumOrTag, int index); - - @JsonRpcMethod("eth_getUncleCountByBlockHash") - int getUncleCountByBlockHash(String blockHash); - - @JsonRpcMethod("eth_getUncleCountByBlockNumber") - int getUncleCountByBlockNumber(String blockNumOrTag); - - @JsonRpcMethod("eth_hashrate") - int getHashRate(); - - @JsonRpcMethod("eth_mining") - boolean isMining(); - -} diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionCall.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionCall.java deleted file mode 100644 index 62f3f02f11d..00000000000 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionCall.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.tron.core.services.jsonrpc; - -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -public class TransactionCall { - - //需要采用public修饰符,否则输入参数不能被识别 - /** - * T开头的用户地址 - */ - public String from; - /** - * T开头的合约地址 - */ - public String to; - public String gas; //not used - public String gasPrice; //not used - public String value; //not used - /** - * 函数的签名 || 输入参数列表 - */ - public String data; - - @Override - public String toString() { - return String.format("{\"from\":\"%s\", \"to\":\"%s\", \"gas\":\"0\", \"gasPrice\":\"0\", " - + "\"value\":\"0\", \"data\":\"%s\"}", from, to, data); - } -} diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java deleted file mode 100644 index e8f9b2eef75..00000000000 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.tron.core.services.jsonrpc; - -public class TransactionReceipt { - - public static class TransactionLog { - - public String logIndex; - public String blockHash; - public String blockNumber; - public String transactionIndex; - public String transactionHash; - public String address; - public String addressBase58; - public String data; - public String[] topics; - - public TransactionLog() { - - } - } - - public String blockHash; - public String blockNumber; - public String transactionIndex; - public String transactionHash; - public String from; - public String fromBase58; - public String to; - public String toBase58; - - public String cumulativeGasUsed; - public String gasUsed; - public String contractAddress; - public String contractAddressBase58; - public TransactionLog[] logs; - public String logsBloom; - - public TransactionReceipt() { - - } -} diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResultDTO.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResultDTO.java deleted file mode 100644 index 97bee1afb7b..00000000000 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResultDTO.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.tron.core.services.jsonrpc; - -import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.encode58Check; -import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getToAddress; -import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTransactionAmount; - -import com.google.protobuf.ByteString; -import java.util.Arrays; -import lombok.Value; -import org.tron.common.utils.ByteArray; -import org.tron.core.Wallet; -import org.tron.core.capsule.BlockCapsule; -import org.tron.core.capsule.TransactionCapsule; -import org.tron.protos.Protocol.Block; -import org.tron.protos.Protocol.Transaction; -import org.tron.protos.Protocol.Transaction.Contract; - -@Value -public class TransactionResultDTO { - - public String hash; - public String nonce; - public String blockHash; - public String blockNumber; - public String transactionIndex; - - public String from; - public String fromBase58; - public String to; - public String toBase58; - public String gas; - public String gasPrice; - public String value; - public String input; - - public String v; - public String r; - public String s; - - public TransactionResultDTO(Block b, int index, Transaction tx, Wallet wallet) { - BlockCapsule blockCapsule = new BlockCapsule(b); - - byte[] txid = new TransactionCapsule(tx).getTransactionId().getBytes(); - hash = ByteArray.toJsonHex(txid); - nonce = ""; // no value - blockHash = ByteArray.toJsonHex(blockCapsule.getBlockId().getBytes()); - blockNumber = ByteArray.toJsonHex(blockCapsule.getNum()); - transactionIndex = ByteArray.toJsonHex(index); - - if (!tx.getRawData().getContractList().isEmpty()) { - Contract contract = tx.getRawData().getContract(0); - byte[] fromByte = TransactionCapsule.getOwner(contract); - byte[] toByte = getToAddress(tx); - from = ByteArray.toJsonHex(fromByte); - to = ByteArray.toJsonHex(toByte); - fromBase58 = encode58Check(fromByte); - toBase58 = encode58Check(toByte); - value = ByteArray.toJsonHex(getTransactionAmount(contract, hash, wallet)); - } else { - from = ""; - to = ""; - fromBase58 = ""; - toBase58 = ""; - value = ""; - } - - gas = ""; - gasPrice = ""; - input = ""; - - ByteString signature = tx.getSignature(0); // r[32] + s[32] + 符号位v[1] - byte[] signData = signature.toByteArray(); - byte vByte = (byte) (signData[64] + 27); //参考函数 Base64toBytes - byte[] rByte = Arrays.copyOfRange(signData, 0, 32); - byte[] sByte = Arrays.copyOfRange(signData, 32, 64); - v = ByteArray.toJsonHex(vByte); - r = ByteArray.toJsonHex(rByte); - s = ByteArray.toJsonHex(sByte); - } - - @Override - public String toString() { - return "TransactionResultDTO{" - + "hash='" + hash + '\'' - + ", nonce='" + nonce + '\'' - + ", blockHash='" + blockHash + '\'' - + ", blockNumber='" + blockNumber + '\'' - + ", transactionIndex='" + transactionIndex + '\'' - + ", from='" + from + '\'' - + ", to='" + to + '\'' - + ", gas='" + gas + '\'' - + ", gasPrice='" + gasPrice + '\'' - + ", value='" + value + '\'' - + ", input='" + input + '\'' - + '}'; - } -} \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java new file mode 100644 index 00000000000..93efc2a80d5 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -0,0 +1,327 @@ +package org.tron.core.services.jsonrpc; + +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.encode58Check; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getToAddress; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTransactionAmount; + +import com.google.protobuf.ByteString; +import com.googlecode.jsonrpc4j.JsonRpcMethod; +import java.math.BigInteger; +import java.util.Arrays; +import lombok.AllArgsConstructor; +import lombok.ToString; +import lombok.Value; +import org.springframework.stereotype.Component; +import org.tron.common.utils.ByteArray; +import org.tron.core.Wallet; +import org.tron.core.capsule.BlockCapsule; +import org.tron.core.capsule.TransactionCapsule; +import org.tron.core.exception.ItemNotFoundException; +import org.tron.protos.Protocol.Block; +import org.tron.protos.Protocol.Transaction; +import org.tron.protos.Protocol.Transaction.Contract; + +@Component +public interface TronJsonRpc { + + @Value + @AllArgsConstructor + @ToString + class SyncingResult { + + private final String startingBlock; + private final String currentBlock; + private final String highestBlock; + } + + class BlockResult { + + public String number; + public String hash; + public String parentHash; + public String nonce; + public String sha3Uncles; + public String logsBloom; + public String transactionsRoot; + public String stateRoot; + public String receiptsRoot; + public String miner; + public String difficulty; + public String totalDifficulty; + public String extraData; + public String size; + public String gasLimit; + public String gasUsed; + public String timestamp; + public Object[] transactions; //TransactionResultDTO or byte32 + public String[] uncles; + + @Override + public String toString() { + return "BlockResult{" + + "number='" + number + '\'' + + ", hash='" + hash + '\'' + + ", parentHash='" + parentHash + '\'' + + ", nonce='" + nonce + '\'' + + ", sha3Uncles='" + sha3Uncles + '\'' + + ", logsBloom='" + logsBloom + '\'' + + ", transactionsRoot='" + transactionsRoot + '\'' + + ", stateRoot='" + stateRoot + '\'' + + ", receiptsRoot='" + receiptsRoot + '\'' + + ", miner='" + miner + '\'' + + ", difficulty='" + difficulty + '\'' + + ", totalDifficulty='" + totalDifficulty + '\'' + + ", extraData='" + extraData + '\'' + + ", size='" + size + '\'' + + ", gas='" + gasLimit + '\'' + + ", gasUsed='" + gasUsed + '\'' + + ", timestamp='" + timestamp + '\'' + + ", transactions=" + Arrays.toString(transactions) + + ", uncles=" + Arrays.toString(uncles) + + '}'; + } + } + + class CallArguments { + + //需要采用public修饰符,否则输入参数不能被识别 + /** + * T开头的用户地址 + */ + public String from; + /** + * T开头的合约地址 + */ + public String to; + public String gas; //not used + public String gasPrice; //not used + public String value; //not used + /** + * 函数的签名 || 输入参数列表 + */ + public String data; + + @Override + public String toString() { + return String.format("{\"from\":\"%s\", \"to\":\"%s\", \"gas\":\"0\", \"gasPrice\":\"0\", " + + "\"value\":\"0\", \"data\":\"%s\"}", from, to, data); + } + } + + class TransactionReceipt { + + public static class TransactionLog { + + public String logIndex; + public String blockHash; + public String blockNumber; + public String transactionIndex; + public String transactionHash; + public String address; + public String addressBase58; + public String data; + public String[] topics; + + public TransactionLog() { + + } + } + + public String blockHash; + public String blockNumber; + public String transactionIndex; + public String transactionHash; + public String from; + public String fromBase58; + public String to; + public String toBase58; + + public String cumulativeGasUsed; + public String gasUsed; + public String contractAddress; + public String contractAddressBase58; + public TransactionLog[] logs; + public String logsBloom; + + public TransactionReceipt() { + + } + } + + class TransactionResult { + + public String hash; + public String nonce; + public String blockHash; + public String blockNumber; + public String transactionIndex; + + public String from; + public String fromBase58; + public String to; + public String toBase58; + public String gas; + public String gasPrice; + public String value; + public String input; + + public String v; + public String r; + public String s; + + public TransactionResult(Block b, int index, Transaction tx, Wallet wallet) { + BlockCapsule blockCapsule = new BlockCapsule(b); + + byte[] txid = new TransactionCapsule(tx).getTransactionId().getBytes(); + hash = ByteArray.toJsonHex(txid); + nonce = ""; // no value + blockHash = ByteArray.toJsonHex(blockCapsule.getBlockId().getBytes()); + blockNumber = ByteArray.toJsonHex(blockCapsule.getNum()); + transactionIndex = ByteArray.toJsonHex(index); + + if (!tx.getRawData().getContractList().isEmpty()) { + Contract contract = tx.getRawData().getContract(0); + byte[] fromByte = TransactionCapsule.getOwner(contract); + byte[] toByte = getToAddress(tx); + from = ByteArray.toJsonHex(fromByte); + to = ByteArray.toJsonHex(toByte); + fromBase58 = encode58Check(fromByte); + toBase58 = encode58Check(toByte); + value = ByteArray.toJsonHex(getTransactionAmount(contract, hash, wallet)); + } else { + from = ""; + to = ""; + fromBase58 = ""; + toBase58 = ""; + value = ""; + } + + gas = ""; + gasPrice = ""; + input = ""; + + ByteString signature = tx.getSignature(0); // r[32] + s[32] + 符号位v[1] + byte[] signData = signature.toByteArray(); + byte vByte = (byte) (signData[64] + 27); //参考函数 Base64toBytes + byte[] rByte = Arrays.copyOfRange(signData, 0, 32); + byte[] sByte = Arrays.copyOfRange(signData, 32, 64); + v = ByteArray.toJsonHex(vByte); + r = ByteArray.toJsonHex(rByte); + s = ByteArray.toJsonHex(sByte); + } + + @Override + public String toString() { + return "TransactionResultDTO{" + + "hash='" + hash + '\'' + + ", nonce='" + nonce + '\'' + + ", blockHash='" + blockHash + '\'' + + ", blockNumber='" + blockNumber + '\'' + + ", transactionIndex='" + transactionIndex + '\'' + + ", from='" + from + '\'' + + ", to='" + to + '\'' + + ", gas='" + gas + '\'' + + ", gasPrice='" + gasPrice + '\'' + + ", value='" + value + '\'' + + ", input='" + input + '\'' + + '}'; + } + } + + @JsonRpcMethod("web3_clientVersion") + String web3ClientVersion(); + + @JsonRpcMethod("web3_sha3") + String web3Sha3(String data) throws Exception; + + @JsonRpcMethod("eth_getBlockTransactionCountByHash") + String ethGetBlockTransactionCountByHash(String blockHash) throws Exception; + + @JsonRpcMethod("eth_getBlockTransactionCountByNumber") + String ethGetBlockTransactionCountByNumber(String bnOrId) throws Exception; + + @JsonRpcMethod("eth_getBlockByHash") + BlockResult ethGetBlockByHash(String blockHash, Boolean fullTransactionObjects) throws Exception; + + @JsonRpcMethod("eth_getBlockByNumber") + BlockResult ethGetBlockByNumber(String bnOrId, Boolean fullTransactionObjects) throws Exception; + + @JsonRpcMethod("net_version") + int getNetVersion(); + + @JsonRpcMethod("net_listening") + boolean isListening(); + + @JsonRpcMethod("eth_protocolVersion") + int getProtocolVersion(); + + @JsonRpcMethod("eth_blockNumber") + int getLatestBlockNum(); + + @JsonRpcMethod("eth_getBalance") + long getTrxBalance(String address, String blockNumOrTag) throws ItemNotFoundException; + + @JsonRpcMethod("eth_getStorageAt") + BigInteger getTrc20Balance(String address, String contractAddress, String blockNumOrTag); + + @JsonRpcMethod("eth_getTransactionCount") + long getSendTransactionCountOfAddress(String address, String blockNumOrTag); + + @JsonRpcMethod("eth_getCode") + String getABIofSmartContract(String contractAddress); + + @JsonRpcMethod("eth_syncing") + Object isSyncing(); + + @JsonRpcMethod("eth_coinbase") + String getCoinbase(); + + @JsonRpcMethod("eth_gasPrice") + String gasPrice(); + + @JsonRpcMethod("eth_estimateGas") + String estimateGas(); + + @JsonRpcMethod("eth_getCompilers") + String[] getCompilers(); + + @JsonRpcMethod("eth_getTransactionByHash") + TransactionResult getTransactionByHash(String txid); + + @JsonRpcMethod("eth_getTransactionByBlockHashAndIndex") + TransactionResult getTransactionByBlockHashAndIndex(String blockHash, int index); + + @JsonRpcMethod("eth_getTransactionByBlockNumberAndIndex") + TransactionResult getTransactionByBlockNumberAndIndex(int blockNum, int index); + + @JsonRpcMethod("eth_gettransactionreceipt") + TransactionReceipt getTransactionReceipt(String txid); + + @JsonRpcMethod("eth_call") + String getCall(CallArguments transactionCall, String blockNumOrTag); + + @JsonRpcMethod("net_peerCount") + int getPeerCount(); + + @JsonRpcMethod("eth_syncing") + Object getSyncingStatus(); + + @JsonRpcMethod("eth_getUncleByBlockHashAndIndex") + BlockResult getUncleByBlockHashAndIndex(String blockHash, int index); + + @JsonRpcMethod("eth_getUncleByBlockNumberAndIndex") + BlockResult getUncleByBlockNumberAndIndex(String blockNumOrTag, int index); + + @JsonRpcMethod("eth_getUncleCountByBlockHash") + int getUncleCountByBlockHash(String blockHash); + + @JsonRpcMethod("eth_getUncleCountByBlockNumber") + int getUncleCountByBlockNumber(String blockNumOrTag); + + @JsonRpcMethod("eth_hashrate") + int getHashRate(); + + @JsonRpcMethod("eth_mining") + boolean isMining(); + +} diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java similarity index 94% rename from framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java rename to framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 2a2e2c51e74..bda9da372c4 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TestServiceImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -10,7 +10,6 @@ import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTxID; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.triggerCallContract; -import com.alibaba.fastjson.JSONObject; import com.google.protobuf.ByteString; import java.math.BigInteger; import java.util.ArrayList; @@ -48,15 +47,15 @@ import org.tron.protos.contract.SmartContractOuterClass.TriggerSmartContract; @Slf4j(topic = "API") -public class TestServiceImpl implements TestService { +public class TronJsonRpcImpl implements TronJsonRpc { private NodeInfoService nodeInfoService; private Wallet wallet; - public TestServiceImpl() { + public TronJsonRpcImpl() { } - public TestServiceImpl(NodeInfoService nodeInfoService, Wallet wallet) { + public TronJsonRpcImpl(NodeInfoService nodeInfoService, Wallet wallet) { this.nodeInfoService = nodeInfoService; this.wallet = wallet; } @@ -156,7 +155,7 @@ protected BlockResult getBlockResult(Block block, boolean fullTx) { List txes = new ArrayList<>(); if (fullTx) { for (int i = 0; i < block.getTransactionsList().size(); i++) { - txes.add(new TransactionResultDTO(block, i, block.getTransactionsList().get(i), wallet)); + txes.add(new TransactionResult(block, i, block.getTransactionsList().get(i), wallet)); } } else { for (Transaction tx : block.getTransactionsList()) { @@ -171,7 +170,7 @@ protected BlockResult getBlockResult(Block block, boolean fullTx) { return br; } - public String ethCall(TransactionCall args, String bnOrId) throws Exception { + public String ethCall(CallArguments args, String bnOrId) throws Exception { //静态调用合约方法。 byte[] addressData = Commons.decodeFromBase58Check(args.from); byte[] contractAddressData = Commons.decodeFromBase58Check(args.to); @@ -362,7 +361,7 @@ public String[] getCompilers() { } @Override - public TransactionResultDTO getTransactionByHash(String txid) { + public TransactionResult getTransactionByHash(String txid) { Transaction transaction = wallet .getTransactionById(ByteString.copyFrom(ByteArray.fromHexString(txid))); TransactionInfo transactionInfo = wallet @@ -378,7 +377,7 @@ public TransactionResultDTO getTransactionByHash(String txid) { return formatRpcTransaction(transaction, block); } - private TransactionResultDTO formatRpcTransaction(Transaction transaction, Block block) { + private TransactionResult formatRpcTransaction(Transaction transaction, Block block) { String txid = ByteArray.toHexString( new TransactionCapsule(transaction).getTransactionId().getBytes()); int transactionIndex = -1; @@ -388,11 +387,11 @@ private TransactionResultDTO formatRpcTransaction(Transaction transaction, Block break; } } - return new TransactionResultDTO(block, transactionIndex, transaction, wallet); + return new TransactionResult(block, transactionIndex, transaction, wallet); } @Override - public TransactionResultDTO getTransactionByBlockHashAndIndex(String blockHash, int index) { + public TransactionResult getTransactionByBlockHashAndIndex(String blockHash, int index) { Block block = wallet.getBlockById(ByteString.copyFrom(ByteArray.fromHexString(blockHash))); if (block == null) { return null; @@ -405,7 +404,7 @@ public TransactionResultDTO getTransactionByBlockHashAndIndex(String blockHash, } @Override - public TransactionResultDTO getTransactionByBlockNumberAndIndex(int blockNum, int index) { + public TransactionResult getTransactionByBlockNumberAndIndex(int blockNum, int index) { Block block = wallet.getBlockByNum(blockNum); if (block == null) { return null; @@ -430,7 +429,7 @@ public TransactionReceipt getTransactionReceipt(String txid) { long blockNum = transactionInfo.getBlockNumber(); Block block = wallet.getBlockByNum(blockNum); - TransactionResultDTO dto = formatRpcTransaction(transaction, block); + TransactionResult dto = formatRpcTransaction(transaction, block); TransactionReceipt receipt = new TransactionReceipt(); receipt.blockHash = dto.blockHash; receipt.blockNumber = dto.blockNumber; @@ -485,7 +484,7 @@ public TransactionReceipt getTransactionReceipt(String txid) { } @Override - public String getCall(TransactionCall transactionCall, String blockNumOrTag) { + public String getCall(CallArguments transactionCall, String blockNumOrTag) { //静态调用合约方法。 byte[] addressData = Commons.decodeFromBase58Check(transactionCall.from); byte[] contractAddressData = Commons.decodeFromBase58Check(transactionCall.to); @@ -504,7 +503,7 @@ private void generateCallParameter() { 32 - addressData.length, addressData.length); String data = getMethodSign("balanceOf(address)") + Hex.toHexString(addressDataWord); - TransactionCall transactionCall = new TransactionCall(); + CallArguments transactionCall = new CallArguments(); transactionCall.from = ownerAddress; transactionCall.to = usdjAddress; transactionCall.data = data; @@ -533,11 +532,11 @@ public Object getSyncingStatus() { .getTimestamp()) / 3000; diff = diff > 0 ? diff : 0; long highestBlock = currentBlock + diff; //预测的最高块号 - JSONObject jsonObject = new JSONObject(true); - jsonObject.put("startingBlock", startingBlock); - jsonObject.put("currentBlock", currentBlock); - jsonObject.put("highestBlock", highestBlock); - return jsonObject; + SyncingResult syncingResult = new SyncingResult(ByteArray.toJsonHex(startingBlock), + ByteArray.toJsonHex(currentBlock), + ByteArray.toJsonHex(highestBlock) + ); + return syncingResult; } @Override @@ -577,7 +576,7 @@ public boolean isMining() { } public static void main(String[] args) { - TestServiceImpl impl = new TestServiceImpl(); + TronJsonRpcImpl impl = new TronJsonRpcImpl(); impl.generateCallParameter(); } } From 91f23d306d2daa66fcff81ce3dd44f6fb04de990 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Fri, 4 Jun 2021 16:56:51 +0800 Subject: [PATCH 025/341] typo --- .../main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 93efc2a80d5..45f6846d6f7 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -53,7 +53,7 @@ class BlockResult { public String gasLimit; public String gasUsed; public String timestamp; - public Object[] transactions; //TransactionResultDTO or byte32 + public Object[] transactions; //TransactionResult or byte32 public String[] uncles; @Override @@ -212,7 +212,7 @@ public TransactionResult(Block b, int index, Transaction tx, Wallet wallet) { @Override public String toString() { - return "TransactionResultDTO{" + return "TransactionResult{" + "hash='" + hash + '\'' + ", nonce='" + nonce + '\'' + ", blockHash='" + blockHash + '\'' From 5a5d92e739b13cfeab060a7fabb1184d5b0e0927 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 9 Jun 2021 17:05:38 +0800 Subject: [PATCH 026/341] feat: update jsonrpc4j gradle --- framework/build.gradle | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/framework/build.gradle b/framework/build.gradle index 1fe421c0b9e..aec01c6aab0 100644 --- a/framework/build.gradle +++ b/framework/build.gradle @@ -79,10 +79,12 @@ dependencies { compile group: 'org.apache.httpcomponents', name: 'httpasyncclient', version: '4.1.1' // end http - implementation('com.github.briandilley.jsonrpc4j:jsonrpc4j:1.6') +// implementation('com.github.briandilley.jsonrpc4j:jsonrpc4j:1.6') + // https://mvnrepository.com/artifact/com.github.briandilley.jsonrpc4j/jsonrpc4j + compile group: 'com.github.briandilley.jsonrpc4j', name: 'jsonrpc4j', version: '1.6' // https://mvnrepository.com/artifact/javax.portlet/portlet-api - compileOnly group: 'javax.portlet', name: 'portlet-api', version: '2.0' + compileOnly group: 'javax.portlet', name: 'portlet-api', version: '3.0.1' compile "io.vavr:vavr:0.9.2" compile group: 'org.pf4j', name: 'pf4j', version: '2.5.0' From cbce9eae5930517358c4689a9843e1216a925638 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Fri, 11 Jun 2021 16:33:21 +0800 Subject: [PATCH 027/341] feat: add config for json-rpc --- .../java/org/tron/common/parameter/CommonParameter.java | 3 +++ framework/src/main/java/org/tron/core/config/args/Args.java | 5 +++++ framework/src/main/java/org/tron/program/FullNode.java | 6 +++--- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/common/src/main/java/org/tron/common/parameter/CommonParameter.java b/common/src/main/java/org/tron/common/parameter/CommonParameter.java index 0cb084f7bb7..91b6ad891e5 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -394,6 +394,9 @@ public class CommonParameter { public boolean solidityNodeHttpEnable = true; @Getter @Setter + public boolean fullNodeHttpJsonRpcEnable = true; + @Getter + @Setter public int maxTransactionPendingSize; @Getter @Setter diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index 98dfe88b942..cf92fd817c8 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -174,6 +174,7 @@ public static void clearParam() { PARAMETER.changedDelegation = 0; PARAMETER.fullNodeHttpEnable = true; PARAMETER.solidityNodeHttpEnable = true; + PARAMETER.fullNodeHttpJsonRpcEnable = true; PARAMETER.nodeMetricsEnable = false; PARAMETER.metricsStorageEnable = false; PARAMETER.agreeNodeCount = MAX_ACTIVE_WITNESS_NUM * 2 / 3 + 1; @@ -290,6 +291,10 @@ public static void setParam(final String[] args, final String confFileName) { PARAMETER.solidityNodeHttpEnable = config.getBoolean(Constant.NODE_HTTP_SOLIDITY_ENABLE); } + if (config.hasPath(Constant.NODE_HTTP_JSONRPC_ENABLE)) { + PARAMETER.fullNodeHttpJsonRpcEnable = config.getBoolean(Constant.NODE_HTTP_JSONRPC_ENABLE); + } + if (config.hasPath(Constant.VM_MIN_TIME_RATIO)) { PARAMETER.minTimeRatio = config.getDouble(Constant.VM_MIN_TIME_RATIO); } diff --git a/framework/src/main/java/org/tron/program/FullNode.java b/framework/src/main/java/org/tron/program/FullNode.java index b9d1abc16d7..0bf75f7abb7 100644 --- a/framework/src/main/java/org/tron/program/FullNode.java +++ b/framework/src/main/java/org/tron/program/FullNode.java @@ -85,10 +85,10 @@ public static void main(String[] args) { } // jsonrpc http server - FullNodeJsonRpcStreamService jsonRpcStreamService = context.getBean(FullNodeJsonRpcStreamService.class); + // FullNodeJsonRpcStreamService jsonRpcStreamService = context.getBean(FullNodeJsonRpcStreamService.class); FullNodeJsonRpcHttpService jsonRpcHttpService = context.getBean(FullNodeJsonRpcHttpService.class); - if (CommonParameter.getInstance().fullNodeHttpEnable) { - appT.addService(jsonRpcStreamService); + if (CommonParameter.getInstance().fullNodeHttpJsonRpcEnable) { + // appT.addService(jsonRpcStreamService); appT.addService(jsonRpcHttpService); } From 5f3cd22282d5846b6dbbdc313a8747da50b9b9be Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Fri, 11 Jun 2021 16:49:16 +0800 Subject: [PATCH 028/341] change output format of jsonrpc api --- .../core/services/jsonrpc/TronJsonRpc.java | 24 +++---- .../services/jsonrpc/TronJsonRpcImpl.java | 69 ++++++++++--------- 2 files changed, 49 insertions(+), 44 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 45f6846d6f7..6eb093167f0 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -86,11 +86,11 @@ class CallArguments { //需要采用public修饰符,否则输入参数不能被识别 /** - * T开头的用户地址 + * 用户地址,16进制 */ public String from; /** - * T开头的合约地址 + * 合约地址,16进制 */ public String to; public String gas; //not used @@ -247,25 +247,25 @@ public String toString() { BlockResult ethGetBlockByNumber(String bnOrId, Boolean fullTransactionObjects) throws Exception; @JsonRpcMethod("net_version") - int getNetVersion(); + String getNetVersion(); @JsonRpcMethod("net_listening") boolean isListening(); @JsonRpcMethod("eth_protocolVersion") - int getProtocolVersion(); + String getProtocolVersion(); @JsonRpcMethod("eth_blockNumber") - int getLatestBlockNum(); + String getLatestBlockNum(); @JsonRpcMethod("eth_getBalance") - long getTrxBalance(String address, String blockNumOrTag) throws ItemNotFoundException; + String getTrxBalance(String address, String blockNumOrTag) throws ItemNotFoundException; @JsonRpcMethod("eth_getStorageAt") - BigInteger getTrc20Balance(String address, String contractAddress, String blockNumOrTag); + String getTrc20Balance(String address, String contractAddress, String blockNumOrTag); @JsonRpcMethod("eth_getTransactionCount") - long getSendTransactionCountOfAddress(String address, String blockNumOrTag); + String getSendTransactionCountOfAddress(String address, String blockNumOrTag); @JsonRpcMethod("eth_getCode") String getABIofSmartContract(String contractAddress); @@ -301,7 +301,7 @@ public String toString() { String getCall(CallArguments transactionCall, String blockNumOrTag); @JsonRpcMethod("net_peerCount") - int getPeerCount(); + String getPeerCount(); @JsonRpcMethod("eth_syncing") Object getSyncingStatus(); @@ -313,13 +313,13 @@ public String toString() { BlockResult getUncleByBlockNumberAndIndex(String blockNumOrTag, int index); @JsonRpcMethod("eth_getUncleCountByBlockHash") - int getUncleCountByBlockHash(String blockHash); + String getUncleCountByBlockHash(String blockHash); @JsonRpcMethod("eth_getUncleCountByBlockNumber") - int getUncleCountByBlockNumber(String blockNumOrTag); + String getUncleCountByBlockNumber(String blockNumOrTag); @JsonRpcMethod("eth_hashrate") - int getHashRate(); + String getHashRate(); @JsonRpcMethod("eth_mining") boolean isMining(); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index bda9da372c4..8c5e3016fd0 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -179,9 +179,9 @@ public String ethCall(CallArguments args, String bnOrId) throws Exception { } @Override - public int getNetVersion() { + public String getNetVersion() { //当前链的id,不能跟metamask已有的id冲突 - return 100; + return ByteArray.toJsonHex(100); } @Override @@ -191,23 +191,24 @@ public boolean isListening() { } @Override - public int getProtocolVersion() { + public String getProtocolVersion() { //当前块的版本号。实际是与代码版本对应的。 - return wallet.getNowBlock().getBlockHeader().getRawData().getVersion(); + return ByteArray.toJsonHex(wallet.getNowBlock().getBlockHeader().getRawData().getVersion()); } @Override - public int getLatestBlockNum() { + public String getLatestBlockNum() { //当前节点同步的最新块号 - return (int) wallet.getNowBlock().getBlockHeader().getRawData().getNumber(); + return ByteArray.toJsonHex(wallet.getNowBlock().getBlockHeader().getRawData().getNumber()); } @Override - public long getTrxBalance(String address, String blockNumOrTag) throws ItemNotFoundException { + public String getTrxBalance(String address, String blockNumOrTag) throws ItemNotFoundException { //某个用户的trx余额,以sun为单位 - byte[] addressData = Commons.decodeFromBase58Check(address); + byte[] addressData = ByteArray.fromHexString(address); Account account = Account.newBuilder().setAddress(ByteString.copyFrom(addressData)).build(); - return wallet.getAccount(account).getBalance(); + long balance = wallet.getAccount(account).getBalance(); + return ByteArray.toJsonHex(balance); } @@ -279,42 +280,45 @@ private String call(byte[] ownerAddressByte, byte[] contractAddressByte, byte[] } @Override - public BigInteger getTrc20Balance(String ownerAddress, String contractAddress, + public String getTrc20Balance(String ownerAddress, String contractAddress, String blockNumOrTag) { //某个用户拥有的某个token20余额,带精度 - byte[] addressData = Commons.decodeFromBase58Check(ownerAddress); + byte[] addressData = ByteArray.fromHexString(ownerAddress); + //byte[] addressData = Commons.decodeFromBase58Check(ownerAddress); //生成dataStr byte[] addressDataWord = new byte[32]; System.arraycopy(addressData, 0, addressDataWord, 32 - addressData.length, addressData.length); String dataStr = balanceOfTopic + Hex.toHexString(addressDataWord); - String result = call(addressData, Commons.decodeFromBase58Check(contractAddress), + String result = call(addressData, ByteArray.fromHexString(contractAddress), ByteArray.fromHexString(dataStr)); if (Objects.isNull(result)) { - return BigInteger.valueOf(0); + return "0x0"; } if (result.length() > 64) { result = result.substring(0, 64); } - return new BigInteger(1, ByteArray.fromHexString(result)); + + return ByteArray.toJsonHex(ByteUtil.stripLeadingZeroes(ByteArray.fromHexString(result))); } @Override - public long getSendTransactionCountOfAddress(String address, String blockNumOrTag) { + public String getSendTransactionCountOfAddress(String address, String blockNumOrTag) { //发起人为某个地址的交易总数。FullNode无法实现该功能 - return wallet.getNowBlock().getBlockHeader().getRawData().getTimestamp() + 86400 * 1000; + return ByteArray.toJsonHex( + wallet.getNowBlock().getBlockHeader().getRawData().getTimestamp() + 86400 * 1000); } @Override public String getABIofSmartContract(String contractAddress) { //获取某个合约地址的字节码 - byte[] addressData = Commons.decodeFromBase58Check(contractAddress); + byte[] addressData = ByteArray.fromHexString(contractAddress); BytesMessage.Builder build = BytesMessage.newBuilder(); BytesMessage bytesMessage = build.setValue(ByteString.copyFrom(addressData)).build(); SmartContract smartContract = wallet.getContract(bytesMessage); - return ByteArray.toHexString(smartContract.getBytecode().toByteArray()); + return ByteArray.toJsonHex(smartContract.getBytecode().toByteArray()); } @Override @@ -327,7 +331,7 @@ public String getCoinbase() { //获取最新块的产块sr地址 byte[] witnessAddress = wallet.getNowBlock().getBlockHeader().getRawData().getWitnessAddress() .toByteArray(); - return encode58Check(witnessAddress); + return ByteArray.toJsonHex(witnessAddress); } @Override @@ -486,8 +490,8 @@ public TransactionReceipt getTransactionReceipt(String txid) { @Override public String getCall(CallArguments transactionCall, String blockNumOrTag) { //静态调用合约方法。 - byte[] addressData = Commons.decodeFromBase58Check(transactionCall.from); - byte[] contractAddressData = Commons.decodeFromBase58Check(transactionCall.to); + byte[] addressData = ByteArray.fromHexString(transactionCall.from); + byte[] contractAddressData = ByteArray.fromHexString(transactionCall.to); return call(addressData, contractAddressData, ByteArray.fromHexString(transactionCall.data)); } @@ -515,20 +519,21 @@ private void generateCallParameter() { } @Override - public int getPeerCount() { + public String getPeerCount() { //返回当前节点所连接的peer节点数量 - return nodeInfoService.getNodeInfo().getPeerList().size(); + return ByteArray.toJsonHex(nodeInfoService.getNodeInfo().getPeerList().size()); } @Override public Object getSyncingStatus() { - //查询同步状态。未同步返回false,否则返回JSonObject + //查询同步状态。未同步返回false,否则返回 SyncingResult if (nodeInfoService.getNodeInfo().getPeerList().size() == 0) { return false; } long startingBlock = nodeInfoService.getNodeInfo().getBeginSyncNum(); - long currentBlock = getLatestBlockNum(); - long diff = (System.currentTimeMillis() - wallet.getNowBlock().getBlockHeader().getRawData() + Block nowBlock = wallet.getNowBlock(); + long currentBlock = nowBlock.getBlockHeader().getRawData().getNumber(); + long diff = (System.currentTimeMillis() - nowBlock.getBlockHeader().getRawData() .getTimestamp()) / 3000; diff = diff > 0 ? diff : 0; long highestBlock = currentBlock + diff; //预测的最高块号 @@ -552,21 +557,21 @@ public BlockResult getUncleByBlockNumberAndIndex(String blockNumOrTag, int index } @Override - public int getUncleCountByBlockHash(String blockHash) { + public String getUncleCountByBlockHash(String blockHash) { //查询指定块hash的分叉个数 - return 0; + return "0x0"; } @Override - public int getUncleCountByBlockNumber(String blockNumOrTag) { + public String getUncleCountByBlockNumber(String blockNumOrTag) { //查询指定块号的分叉个数 - return 0; + return "0x0"; } @Override - public int getHashRate() { + public String getHashRate() { //读取当前挖矿节点的每秒钟哈希值算出数量,无用 - return 0; + return "0x0"; } @Override From 53baaea461672491aa1e0b89698094cefbd39612 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Tue, 15 Jun 2021 14:27:09 +0800 Subject: [PATCH 029/341] feat: set to null instead of "" if no value --- .../tron/core/services/jsonrpc/TronJsonRpc.java | 2 +- .../core/services/jsonrpc/TronJsonRpcImpl.java | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 6eb093167f0..264a5c8bc9e 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -174,7 +174,7 @@ public TransactionResult(Block b, int index, Transaction tx, Wallet wallet) { byte[] txid = new TransactionCapsule(tx).getTransactionId().getBytes(); hash = ByteArray.toJsonHex(txid); - nonce = ""; // no value + nonce = null; // no value blockHash = ByteArray.toJsonHex(blockCapsule.getBlockId().getBytes()); blockNumber = ByteArray.toJsonHex(blockCapsule.getNum()); transactionIndex = ByteArray.toJsonHex(index); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 8c5e3016fd0..5d645aed9dc 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -135,21 +135,21 @@ protected BlockResult getBlockResult(Block block, boolean fullTx) { br.number = ByteArray.toJsonHex(blockCapsule.getNum()); br.hash = ByteArray.toJsonHex(blockCapsule.getBlockId().getBytes()); br.parentHash = ByteArray.toJsonHex(blockCapsule.getParentBlockId().getBytes()); - br.nonce = ""; // no value - br.sha3Uncles = ""; // no value - br.logsBloom = ""; // no value + br.nonce = null; // no value + br.sha3Uncles = null; // no value + br.logsBloom = null; // no value br.transactionsRoot = ByteArray .toJsonHex(block.getBlockHeader().getRawData().getTxTrieRoot().toByteArray()); br.stateRoot = ByteArray .toJsonHex(block.getBlockHeader().getRawData().getAccountStateRoot().toByteArray()); - br.receiptsRoot = ""; // no value + br.receiptsRoot = null; // no value br.miner = ByteArray.toJsonHex(blockCapsule.getWitnessAddress().toByteArray()); - br.difficulty = ""; // no value - br.totalDifficulty = ""; // no value + br.difficulty = null; // no value + br.totalDifficulty = null; // no value // br.extraData // no value br.size = ByteArray.toJsonHex(block.getSerializedSize()); - br.gasLimit = ""; - br.gasUsed = ""; + br.gasLimit = null; + br.gasUsed = null; br.timestamp = ByteArray.toJsonHex(blockCapsule.getTimeStamp()); List txes = new ArrayList<>(); From e99b78f003dcee785b1e8ccff736a29223913b71 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 16 Jun 2021 16:18:37 +0800 Subject: [PATCH 030/341] change some parameter in rpc api --- .../jsonrpc/FullNodeJsonRpcStreamService.java | 76 ------------------- .../services/jsonrpc/StreamClientDemo.java | 40 ---------- .../core/services/jsonrpc/TronJsonRpc.java | 4 +- .../services/jsonrpc/TronJsonRpcImpl.java | 44 +++++------ .../main/java/org/tron/program/FullNode.java | 1 - 5 files changed, 21 insertions(+), 144 deletions(-) delete mode 100644 framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcStreamService.java delete mode 100644 framework/src/main/java/org/tron/core/services/jsonrpc/StreamClientDemo.java diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcStreamService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcStreamService.java deleted file mode 100644 index 7a61afdbd9a..00000000000 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcStreamService.java +++ /dev/null @@ -1,76 +0,0 @@ -package org.tron.core.services.jsonrpc; - -import com.googlecode.jsonrpc4j.JsonRpcServer; -import com.googlecode.jsonrpc4j.ProxyUtil; -import com.googlecode.jsonrpc4j.StreamServer; -import java.net.InetAddress; -import java.net.ServerSocket; -import javax.net.ServerSocketFactory; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.tron.common.application.Service; -import org.tron.common.parameter.CommonParameter; -import org.tron.core.Wallet; -import org.tron.core.services.NodeInfoService; - -@Component -@Slf4j(topic = "API") -public class FullNodeJsonRpcStreamService implements Service { - - private int port = 8099; - - private JsonRpcServer jsonRpcServer; - private TronJsonRpcImpl testServiceImpl; - private StreamServer streamServer; - - @Autowired - private NodeInfoService nodeInfoService; - @Autowired - private Wallet wallet; - - @Override - public void init() { - } - - @Override - public void init(CommonParameter args) { - } - - @Override - public void start() { - testServiceImpl = new TronJsonRpcImpl(nodeInfoService, wallet); - - Object compositeService = ProxyUtil.createCompositeServiceProxy( - this.getClass().getClassLoader(), - new Object[] {testServiceImpl}, - new Class[] {TronJsonRpc.class}, - true); - - jsonRpcServer = new JsonRpcServer(compositeService); - - // create the stream server - int maxThreads = 50; - ServerSocket serverSocket; - try { - // serverSocket = new ServerSocket(port); - InetAddress bindAddress = InetAddress.getByName("127.0.0.1"); - serverSocket = ServerSocketFactory.getDefault().createServerSocket(port, 0, bindAddress); - } catch (Exception e) { - return; - } - streamServer = new StreamServer(jsonRpcServer, maxThreads, serverSocket); - -// start it, this method doesn't block - streamServer.start(); - } - - @Override - public void stop() { - try { - streamServer.stop(); - } catch (Exception e) { - logger.debug("IOException: {}", e.getMessage()); - } - } -} diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/StreamClientDemo.java b/framework/src/main/java/org/tron/core/services/jsonrpc/StreamClientDemo.java deleted file mode 100644 index 3da50bd49b4..00000000000 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/StreamClientDemo.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.tron.core.services.jsonrpc; - -import com.googlecode.jsonrpc4j.JsonRpcClient; -import com.googlecode.jsonrpc4j.JsonRpcServer; -import com.googlecode.jsonrpc4j.StreamServer; -import java.net.InetAddress; -import java.net.Socket; -import java.util.ArrayList; -import java.util.List; - -public class StreamClientDemo { - - // private int port = Args.getInstance().getRpcOnSolidityPort() + 1; - private int port = 8099; - private JsonRpcServer jsonRpcServer; - private StreamServer streamServer; - - - public void client() throws Throwable { - InetAddress bindAddress = InetAddress.getByName("127.0.0.1"); - Socket socket = new Socket(bindAddress, port); - JsonRpcClient jsonRpcClient = new JsonRpcClient(); - - // Map params = new HashMap(); - // params.put("a", 3); - // params.put("b", 4); - List params = new ArrayList<>(); - params.add(12); - - Integer res = jsonRpcClient.invokeAndReadResponse("getNetVersion", params, Integer.class, - socket.getOutputStream(), socket.getInputStream()); - System.out.println(res); //传参方法三:通过ProxyUtil 客户端调用 - - } - - public static void main(String[] args) throws Throwable { - StreamClientDemo demo = new StreamClientDemo(); - demo.client(); - } -} diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 264a5c8bc9e..aaa5db5f47c 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -289,10 +289,10 @@ public String toString() { TransactionResult getTransactionByHash(String txid); @JsonRpcMethod("eth_getTransactionByBlockHashAndIndex") - TransactionResult getTransactionByBlockHashAndIndex(String blockHash, int index); + TransactionResult getTransactionByBlockHashAndIndex(String blockHash, String index); @JsonRpcMethod("eth_getTransactionByBlockNumberAndIndex") - TransactionResult getTransactionByBlockNumberAndIndex(int blockNum, int index); + TransactionResult getTransactionByBlockNumberAndIndex(String blockNumOrTag, String index); @JsonRpcMethod("eth_gettransactionreceipt") TransactionReceipt getTransactionReceipt(String txid); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 5d645aed9dc..3e51683312f 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -34,7 +34,6 @@ import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.TransactionCapsule; import org.tron.core.exception.ContractValidateException; -import org.tron.core.exception.ItemNotFoundException; import org.tron.core.exception.VMIllegalException; import org.tron.core.services.NodeInfoService; import org.tron.program.Version; @@ -92,8 +91,8 @@ public String ethGetBlockTransactionCountByHash(String blockHash) throws Excepti } @Override - public String ethGetBlockTransactionCountByNumber(String bnOrId) throws Exception { - List list = wallet.getTransactionsByJsonBlockId(bnOrId); + public String ethGetBlockTransactionCountByNumber(String blockNumOrTag) throws Exception { + List list = wallet.getTransactionsByJsonBlockId(blockNumOrTag); if (list == null) { return null; } @@ -110,17 +109,12 @@ public BlockResult ethGetBlockByHash(String blockHash, Boolean fullTransactionOb } @Override - public BlockResult ethGetBlockByNumber(String bnOrId, Boolean fullTransactionObjects) { - final Block b; - if ("pending".equalsIgnoreCase(bnOrId)) { - b = null; - } else { - b = wallet.getByJsonBlockId(bnOrId); - } + public BlockResult ethGetBlockByNumber(String blockNumOrTag, Boolean fullTransactionObjects) { + final Block b = wallet.getByJsonBlockId(blockNumOrTag); return (b == null ? null : getBlockResult(b, fullTransactionObjects)); } - private Block getBlockByJSonHash(String blockHash) throws Exception { + private Block getBlockByJSonHash(String blockHash) { return wallet.getBlockById(ByteString.copyFrom(ByteArray.fromHexString(blockHash))); } @@ -203,7 +197,7 @@ public String getLatestBlockNum() { } @Override - public String getTrxBalance(String address, String blockNumOrTag) throws ItemNotFoundException { + public String getTrxBalance(String address, String blockNumOrTag) { //某个用户的trx余额,以sun为单位 byte[] addressData = ByteArray.fromHexString(address); Account account = Account.newBuilder().setAddress(ByteString.copyFrom(addressData)).build(); @@ -211,7 +205,6 @@ public String getTrxBalance(String address, String blockNumOrTag) throws ItemNot return ByteArray.toJsonHex(balance); } - /** * @param data Hash of the method signature and encoded parameters. * for example: getMethodSign(methodName(uint256,uint256)) || data1 || data2 @@ -395,34 +388,35 @@ private TransactionResult formatRpcTransaction(Transaction transaction, Block bl } @Override - public TransactionResult getTransactionByBlockHashAndIndex(String blockHash, int index) { + public TransactionResult getTransactionByBlockHashAndIndex(String blockHash, String index) { Block block = wallet.getBlockById(ByteString.copyFrom(ByteArray.fromHexString(blockHash))); if (block == null) { return null; } - if (index > block.getTransactionsCount() - 1) { + int txIndex = ByteArray.hexToBigInteger(index).intValue(); + if (txIndex > block.getTransactionsCount() - 1) { return null; } - Transaction transaction = block.getTransactions(index); + Transaction transaction = block.getTransactions(txIndex); return formatRpcTransaction(transaction, block); } @Override - public TransactionResult getTransactionByBlockNumberAndIndex(int blockNum, int index) { - Block block = wallet.getBlockByNum(blockNum); + public TransactionResult getTransactionByBlockNumberAndIndex(String blockNumOrTag, String index) { + Block block = wallet.getByJsonBlockId(blockNumOrTag); if (block == null) { return null; } - if (index > block.getTransactionsCount() - 1) { + int txIndex = ByteArray.hexToBigInteger(index).intValue(); + if (txIndex > block.getTransactionsCount() - 1) { return null; } - Transaction transaction = block.getTransactions(index); + Transaction transaction = block.getTransactions(txIndex); return formatRpcTransaction(transaction, block); } @Override public TransactionReceipt getTransactionReceipt(String txid) { - Transaction transaction = wallet .getTransactionById(ByteString.copyFrom(ByteArray.fromHexString(txid))); TransactionInfo transactionInfo = wallet @@ -496,8 +490,8 @@ public String getCall(CallArguments transactionCall, String blockNumOrTag) { return call(addressData, contractAddressData, ByteArray.fromHexString(transactionCall.data)); } - //生成一个调用call api的参数,可以自由修改 - private void generateCallParameter() { + //生成一个调用 eth_call api的参数,可以自由修改 + private String generateCallParameter() { String ownerAddress = "TXvRyjomvtNWSKvNouTvAedRGD4w9RXLZD"; String usdjAddress = "TLBaRhANQoJFTqre9Nf1mjuwNWjCJeYqUL"; // nile测试环境udsj地址 @@ -515,7 +509,7 @@ private void generateCallParameter() { StringBuffer sb = new StringBuffer("{\"jsonrpc\":\"2.0\",\"method\":\"eth_call\",\"params\":["); sb.append(transactionCall); sb.append(", \"latest\"],\"id\":1}"); - System.out.println(sb); + return sb.toString(); } @Override @@ -582,6 +576,6 @@ public boolean isMining() { public static void main(String[] args) { TronJsonRpcImpl impl = new TronJsonRpcImpl(); - impl.generateCallParameter(); + System.out.println(impl.generateCallParameter()); } } diff --git a/framework/src/main/java/org/tron/program/FullNode.java b/framework/src/main/java/org/tron/program/FullNode.java index 0bf75f7abb7..b09bf0b32e6 100644 --- a/framework/src/main/java/org/tron/program/FullNode.java +++ b/framework/src/main/java/org/tron/program/FullNode.java @@ -20,7 +20,6 @@ import org.tron.core.services.interfaceOnSolidity.RpcApiServiceOnSolidity; import org.tron.core.services.interfaceOnSolidity.http.solidity.HttpApiOnSolidityService; import org.tron.core.services.jsonrpc.FullNodeJsonRpcHttpService; -import org.tron.core.services.jsonrpc.FullNodeJsonRpcStreamService; @Slf4j(topic = "app") public class FullNode { From d04a497eb2fb196b90016dc874c747988be43814 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 16 Jun 2021 17:51:29 +0800 Subject: [PATCH 031/341] feat: add specified error handle --- .../services/jsonrpc/JsonRpcApiException.java | 8 ++++++++ .../core/services/jsonrpc/TronJsonRpc.java | 6 +++++- .../core/services/jsonrpc/TronJsonRpcImpl.java | 18 +++++++++++++++++- 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiException.java diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiException.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiException.java new file mode 100644 index 00000000000..7a2d59c1314 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiException.java @@ -0,0 +1,8 @@ +package org.tron.core.services.jsonrpc; + +public class JsonRpcApiException extends RuntimeException { + + public JsonRpcApiException(String msg) { + super(msg); + } +} \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 264a5c8bc9e..ca00c52b8f0 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -5,8 +5,9 @@ import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTransactionAmount; import com.google.protobuf.ByteString; +import com.googlecode.jsonrpc4j.JsonRpcError; +import com.googlecode.jsonrpc4j.JsonRpcErrors; import com.googlecode.jsonrpc4j.JsonRpcMethod; -import java.math.BigInteger; import java.util.Arrays; import lombok.AllArgsConstructor; import lombok.ToString; @@ -241,6 +242,9 @@ public String toString() { String ethGetBlockTransactionCountByNumber(String bnOrId) throws Exception; @JsonRpcMethod("eth_getBlockByHash") + @JsonRpcErrors({ + @JsonRpcError(exception=JsonRpcApiException.class, code=-32602, data="no data"), + }) BlockResult ethGetBlockByHash(String blockHash, Boolean fullTransactionObjects) throws Exception; @JsonRpcMethod("eth_getBlockByNumber") diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 5d645aed9dc..1281665441a 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -48,6 +48,7 @@ @Slf4j(topic = "API") public class TronJsonRpcImpl implements TronJsonRpc { + String regexHash = "(0x)?[a-zA-Z0-9]{64}$"; private NodeInfoService nodeInfoService; private Wallet wallet; @@ -120,8 +121,23 @@ public BlockResult ethGetBlockByNumber(String bnOrId, Boolean fullTransactionObj return (b == null ? null : getBlockResult(b, fullTransactionObjects)); } + private byte[] hashToByteArray(String hash) { + if(!Pattern.matches(regexHash, hash)) { + throw new JsonRpcApiException("invalid hash value"); + } + + byte[] bHash; + try { + bHash = ByteArray.fromHexString(hash); + } catch (Exception e) { + throw new JsonRpcApiException(e.getMessage()); + } + return bHash; + } + private Block getBlockByJSonHash(String blockHash) throws Exception { - return wallet.getBlockById(ByteString.copyFrom(ByteArray.fromHexString(blockHash))); + byte[] bHash = hashToByteArray(blockHash); + return wallet.getBlockById(ByteString.copyFrom(bHash)); } protected BlockResult getBlockResult(Block block, boolean fullTx) { From 380a00a59bf629e30fd8cbcb39d5c5eb336800ec Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 17 Jun 2021 12:30:28 +0800 Subject: [PATCH 032/341] feat: add path spec for json rpc --- .../tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java index cce8100ecd5..bf2d7d6a917 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java @@ -58,7 +58,7 @@ public void start() { context.setContextPath("/"); server.setHandler(context); - context.addServlet(new ServletHolder(jsonRpcServlet), "/"); + context.addServlet(new ServletHolder(jsonRpcServlet), "/jsonrpc"); // filter // ServletHandler handler = new ServletHandler(); From de1c6dafe5d0c3a6d72c0db837a2f05146e42f94 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 17 Jun 2021 14:36:50 +0800 Subject: [PATCH 033/341] feat: check input --- framework/src/main/java/org/tron/core/Wallet.java | 10 ++++++++-- .../services/jsonrpc/FullNodeJsonRpcHttpService.java | 7 +------ .../org/tron/core/services/jsonrpc/TronJsonRpc.java | 9 +++++++++ .../tron/core/services/jsonrpc/TronJsonRpcImpl.java | 7 +++---- 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index cf4aab85d80..26d353304f9 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -171,6 +171,7 @@ import org.tron.core.net.TronNetDelegate; import org.tron.core.net.TronNetService; import org.tron.core.net.message.TransactionMessage; +import org.tron.core.services.jsonrpc.JsonRpcApiException; import org.tron.core.store.AccountIdIndexStore; import org.tron.core.store.AccountStore; import org.tron.core.store.AccountTraceStore; @@ -670,14 +671,19 @@ public Block getByJsonBlockId(String id) { } else if ("pending".equalsIgnoreCase(id)) { return null; } else { - long blockNumber = ByteArray.hexToBigInteger(id).longValue(); + long blockNumber; + try { + blockNumber = ByteArray.hexToBigInteger(id).longValue(); + } catch (Exception e) { + throw new JsonRpcApiException("invalid block number"); + } + return getBlockByNum(blockNumber); } } public List getTransactionsByJsonBlockId(String id) { if ("pending".equalsIgnoreCase(id)) { - // todo return null; } else { Block block = getByJsonBlockId(id); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java index bf2d7d6a917..3f284b1d32d 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java @@ -30,8 +30,7 @@ @Slf4j(topic = "API") public class FullNodeJsonRpcHttpService implements Service { - private int port = Args.getInstance().getJsonRpcHttpPort(); -// private int port = 8098; + private int port = CommonParameter.getInstance().getJsonRpcHttpPort(); private Server server; @@ -46,10 +45,6 @@ public void init() { public void init(CommonParameter args) { } - // protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException { - // jsonRpcServer.handle(req, resp); - // } - @Override public void start() { try { diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 1a719f8483d..d6c97c34fbb 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -236,9 +236,15 @@ public String toString() { String web3Sha3(String data) throws Exception; @JsonRpcMethod("eth_getBlockTransactionCountByHash") + @JsonRpcErrors({ + @JsonRpcError(exception=JsonRpcApiException.class, code=-32602, data="{}"), + }) String ethGetBlockTransactionCountByHash(String blockHash) throws Exception; @JsonRpcMethod("eth_getBlockTransactionCountByNumber") + @JsonRpcErrors({ + @JsonRpcError(exception=JsonRpcApiException.class, code=-32602, data="{}"), + }) String ethGetBlockTransactionCountByNumber(String bnOrId) throws Exception; @JsonRpcMethod("eth_getBlockByHash") @@ -248,6 +254,9 @@ public String toString() { BlockResult ethGetBlockByHash(String blockHash, Boolean fullTransactionObjects) throws Exception; @JsonRpcMethod("eth_getBlockByNumber") + @JsonRpcErrors({ + @JsonRpcError(exception=JsonRpcApiException.class, code=-32602, data="{}"), + }) BlockResult ethGetBlockByNumber(String bnOrId, Boolean fullTransactionObjects) throws Exception; @JsonRpcMethod("net_version") diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 6393f456885..4b0cce0ad92 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -82,7 +82,7 @@ public String web3Sha3(String data) { @Override public String ethGetBlockTransactionCountByHash(String blockHash) throws Exception { - Block b = getBlockByJSonHash(blockHash); + Block b = getBlockByJsonHash(blockHash); if (b == null) { return null; } @@ -105,7 +105,7 @@ public String ethGetBlockTransactionCountByNumber(String blockNumOrTag) throws E @Override public BlockResult ethGetBlockByHash(String blockHash, Boolean fullTransactionObjects) throws Exception { - final Block b = getBlockByJSonHash(blockHash); + final Block b = getBlockByJsonHash(blockHash); return getBlockResult(b, fullTransactionObjects); } @@ -129,7 +129,7 @@ private byte[] hashToByteArray(String hash) { return bHash; } - private Block getBlockByJSonHash(String blockHash) throws Exception { + private Block getBlockByJsonHash(String blockHash) throws Exception { byte[] bHash = hashToByteArray(blockHash); return wallet.getBlockById(ByteString.copyFrom(bHash)); } @@ -140,7 +140,6 @@ protected BlockResult getBlockResult(Block block, boolean fullTx) { } BlockCapsule blockCapsule = new BlockCapsule(block); - boolean isPending = false; BlockResult br = new BlockResult(); br.number = ByteArray.toJsonHex(blockCapsule.getNum()); br.hash = ByteArray.toJsonHex(blockCapsule.getBlockId().getBytes()); From 6e1f6c508ac3dca3af8498e23cb70eeb6ad46873 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 17 Jun 2021 14:40:20 +0800 Subject: [PATCH 034/341] typo --- .../core/services/jsonrpc/JsonRpcApiUtil.java | 34 ------------------- 1 file changed, 34 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index a6547c2815b..d0d2fac5e47 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -185,10 +185,6 @@ public static List getTo(Transaction transaction) { case AccountCreateContract: list.add(contractParameter.unpack(AccountCreateContract.class).getAccountAddress()); break; - case AccountUpdateContract: - break; - case SetAccountIdContract: - break; case TransferContract: list.add(contractParameter.unpack(TransferContract.class).getToAddress()); break; @@ -203,12 +199,6 @@ public static List getTo(Transaction transaction) { list.add(vote.getVoteAddress()); } break; - case WitnessCreateContract: - break; - case AssetIssueContract: - break; - case WitnessUpdateContract: - break; case ParticipateAssetIssueContract: list.add(contractParameter.unpack(ParticipateAssetIssueContract.class).getToAddress()); break; @@ -226,24 +216,12 @@ public static List getTo(Transaction transaction) { list.add(receiverAddress); } break; - case UnfreezeAssetContract: - break; - case WithdrawBalanceContract: - break; case CreateSmartContract: list.add(ByteString.copyFrom(generateContractAddress(transaction))); break; case TriggerSmartContract: list.add(contractParameter.unpack(TriggerSmartContract.class).getContractAddress()); break; - case UpdateAssetContract: - break; - case ProposalCreateContract: - break; - case ProposalApproveContract: - break; - case ProposalDeleteContract: - break; // case BuyStorageContract: // owner = contractParameter.unpack(BuyStorageContract.class).getOwnerAddress(); // break; @@ -256,24 +234,12 @@ public static List getTo(Transaction transaction) { case UpdateSettingContract: list.add(contractParameter.unpack(UpdateSettingContract.class).getContractAddress()); break; - case ExchangeCreateContract: - break; - case ExchangeInjectContract: - break; - case ExchangeWithdrawContract: - break; - case ExchangeTransactionContract: - break; case UpdateEnergyLimitContract: list.add(contractParameter.unpack(UpdateEnergyLimitContract.class).getContractAddress()); break; - case AccountPermissionUpdateContract: - break; case ClearABIContract: list.add(contractParameter.unpack(ClearABIContract.class).getContractAddress()); break; - case UpdateBrokerageContract: - break; case ShieldedTransferContract: ShieldedTransferContract shieldedTransferContract = contract.getParameter() .unpack(ShieldedTransferContract.class); From fbeb75f6a21b6b4b33212a5f25792ce258395c49 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 17 Jun 2021 14:45:21 +0800 Subject: [PATCH 035/341] typo --- .../java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 4b0cce0ad92..98f7242d559 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -134,7 +134,7 @@ private Block getBlockByJsonHash(String blockHash) throws Exception { return wallet.getBlockById(ByteString.copyFrom(bHash)); } - protected BlockResult getBlockResult(Block block, boolean fullTx) { + private BlockResult getBlockResult(Block block, boolean fullTx) { if (block == null) { return null; } From 4996457cebe486e4a9988c4b447d0a108d98e12d Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 17 Jun 2021 14:47:16 +0800 Subject: [PATCH 036/341] feat: set block extra data to null --- .../java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 98f7242d559..c2a8b974873 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -155,7 +155,7 @@ private BlockResult getBlockResult(Block block, boolean fullTx) { br.miner = ByteArray.toJsonHex(blockCapsule.getWitnessAddress().toByteArray()); br.difficulty = null; // no value br.totalDifficulty = null; // no value - // br.extraData // no value + br.extraData = null; // no value br.size = ByteArray.toJsonHex(block.getSerializedSize()); br.gasLimit = null; br.gasUsed = null; From 73c1d99e5ba45d1223f17acf11b7d7020f01708b Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 17 Jun 2021 15:05:48 +0800 Subject: [PATCH 037/341] feat: delete base58 param --- .../core/services/jsonrpc/JsonRpcApiUtil.java | 16 ++++++++-------- .../tron/core/services/jsonrpc/TronJsonRpc.java | 17 ++++------------- .../core/services/jsonrpc/TronJsonRpcImpl.java | 4 +--- 3 files changed, 13 insertions(+), 24 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index d0d2fac5e47..64c495e5b29 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -333,14 +333,14 @@ public static long getTransactionAmount(Transaction.Contract contract, String ha amount = 1024_000_000L; break; case ParticipateAssetIssueContract: -// long token = DataImporter.getTokenID(blockNum, -// contractParameter.unpack(ParticipateAssetIssueContract.class).getAssetName()); -// //获取token的比例,计算出10币的数量 -// long trxNum = contractParameter.unpack(ParticipateAssetIssueContract.class).getAmount(); -// Token10Entity entity = DataImporter.getTokenEntity(token); -// long exchangeAmount = Math.multiplyExact(trxNum, entity.getNum()); -// exchangeAmount = Math.floorDiv(exchangeAmount, entity.getTrxNum()); -// amount = exchangeAmount; + // long token = DataImporter.getTokenID(blockNum, + // contractParameter.unpack(ParticipateAssetIssueContract.class).getAssetName()); + // //获取token的比例,计算出10币的数量 + // long trxNum = contractParameter.unpack(ParticipateAssetIssueContract.class).getAmount(); + // Token10Entity entity = DataImporter.getTokenEntity(token); + // long exchangeAmount = Math.multiplyExact(trxNum, entity.getNum()); + // exchangeAmount = Math.floorDiv(exchangeAmount, entity.getTrxNum()); + // amount = exchangeAmount; break; case FreezeBalanceContract: amount = contractParameter.unpack(FreezeBalanceContract.class).getFrozenBalance(); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index d6c97c34fbb..9b3a05076f9 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -133,14 +133,11 @@ public TransactionLog() { public String transactionIndex; public String transactionHash; public String from; - public String fromBase58; public String to; - public String toBase58; public String cumulativeGasUsed; public String gasUsed; public String contractAddress; - public String contractAddressBase58; public TransactionLog[] logs; public String logsBloom; @@ -158,9 +155,7 @@ class TransactionResult { public String transactionIndex; public String from; - public String fromBase58; public String to; - public String toBase58; public String gas; public String gasPrice; public String value; @@ -186,14 +181,10 @@ public TransactionResult(Block b, int index, Transaction tx, Wallet wallet) { byte[] toByte = getToAddress(tx); from = ByteArray.toJsonHex(fromByte); to = ByteArray.toJsonHex(toByte); - fromBase58 = encode58Check(fromByte); - toBase58 = encode58Check(toByte); value = ByteArray.toJsonHex(getTransactionAmount(contract, hash, wallet)); } else { from = ""; to = ""; - fromBase58 = ""; - toBase58 = ""; value = ""; } @@ -237,25 +228,25 @@ public String toString() { @JsonRpcMethod("eth_getBlockTransactionCountByHash") @JsonRpcErrors({ - @JsonRpcError(exception=JsonRpcApiException.class, code=-32602, data="{}"), + @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{}"), }) String ethGetBlockTransactionCountByHash(String blockHash) throws Exception; @JsonRpcMethod("eth_getBlockTransactionCountByNumber") @JsonRpcErrors({ - @JsonRpcError(exception=JsonRpcApiException.class, code=-32602, data="{}"), + @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{}"), }) String ethGetBlockTransactionCountByNumber(String bnOrId) throws Exception; @JsonRpcMethod("eth_getBlockByHash") @JsonRpcErrors({ - @JsonRpcError(exception=JsonRpcApiException.class, code=-32602, data="{}"), + @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{}"), }) BlockResult ethGetBlockByHash(String blockHash, Boolean fullTransactionObjects) throws Exception; @JsonRpcMethod("eth_getBlockByNumber") @JsonRpcErrors({ - @JsonRpcError(exception=JsonRpcApiException.class, code=-32602, data="{}"), + @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{}"), }) BlockResult ethGetBlockByNumber(String bnOrId, Boolean fullTransactionObjects) throws Exception; diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index c2a8b974873..7508968f3f9 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -116,7 +116,7 @@ public BlockResult ethGetBlockByNumber(String blockNumOrTag, Boolean fullTransac } private byte[] hashToByteArray(String hash) { - if(!Pattern.matches(regexHash, hash)) { + if (!Pattern.matches(regexHash, hash)) { throw new JsonRpcApiException("invalid hash value"); } @@ -449,9 +449,7 @@ public TransactionReceipt getTransactionReceipt(String txid) { receipt.transactionIndex = dto.transactionIndex; receipt.transactionHash = dto.hash; receipt.from = dto.from; - receipt.fromBase58 = dto.fromBase58; receipt.to = dto.to; - receipt.toBase58 = dto.toBase58; long cumulativeGasUsed = 0; TransactionInfoList infoList = wallet.getTransactionInfoByBlockNum(blockNum); From 142d70ca3c6b585af88b46365530f6643537d7bc Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Thu, 17 Jun 2021 19:33:23 +0800 Subject: [PATCH 038/341] rewrite eth_getStorageAt in jsonrpc --- .../core/services/jsonrpc/JsonRpcServlet.java | 5 +- .../core/services/jsonrpc/TronJsonRpc.java | 3 +- .../services/jsonrpc/TronJsonRpcImpl.java | 58 +++++++++++-------- 3 files changed, 38 insertions(+), 28 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java index 9be2054ce82..d0874604f3f 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java @@ -11,6 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.tron.core.Wallet; +import org.tron.core.db.Manager; import org.tron.core.services.NodeInfoService; import org.tron.core.services.http.RateLimiterServlet; @@ -26,11 +27,13 @@ public class JsonRpcServlet extends RateLimiterServlet { private NodeInfoService nodeInfoService; @Autowired private Wallet wallet; + @Autowired + private Manager manager; // @Override public void init(ServletConfig config) throws ServletException { super.init(config); - testServiceImpl = new TronJsonRpcImpl(nodeInfoService, wallet); + testServiceImpl = new TronJsonRpcImpl(nodeInfoService, wallet, manager); Object compositeService = ProxyUtil.createCompositeServiceProxy( this.getClass().getClassLoader(), new Object[] {testServiceImpl}, diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 9b3a05076f9..52fd84d0769 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -1,6 +1,5 @@ package org.tron.core.services.jsonrpc; -import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.encode58Check; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getToAddress; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTransactionAmount; @@ -266,7 +265,7 @@ public String toString() { String getTrxBalance(String address, String blockNumOrTag) throws ItemNotFoundException; @JsonRpcMethod("eth_getStorageAt") - String getTrc20Balance(String address, String contractAddress, String blockNumOrTag); + String getStorageAt(String address, String storageIdx, String blockNumOrTag); @JsonRpcMethod("eth_getTransactionCount") String getSendTransactionCountOfAddress(String address, String blockNumOrTag); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 7508968f3f9..f83eae243f4 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -2,7 +2,6 @@ import static org.tron.core.Wallet.CONTRACT_VALIDATE_ERROR; import static org.tron.core.Wallet.CONTRACT_VALIDATE_EXCEPTION; -import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.balanceOfTopic; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.convertToTronAddress; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.encode58Check; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.generateContractAddress; @@ -15,7 +14,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Objects; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -27,15 +25,19 @@ import org.tron.api.GrpcAPI.TransactionExtention; import org.tron.api.GrpcAPI.TransactionInfoList; import org.tron.common.crypto.Hash; +import org.tron.common.runtime.vm.DataWord; import org.tron.common.utils.ByteArray; import org.tron.common.utils.ByteUtil; import org.tron.common.utils.Commons; import org.tron.core.Wallet; import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.TransactionCapsule; +import org.tron.core.db.Manager; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.VMIllegalException; import org.tron.core.services.NodeInfoService; +import org.tron.core.store.StorageRowStore; +import org.tron.core.vm.program.Storage; import org.tron.program.Version; import org.tron.protos.Protocol.Account; import org.tron.protos.Protocol.Block; @@ -47,17 +49,20 @@ @Slf4j(topic = "API") public class TronJsonRpcImpl implements TronJsonRpc { + String regexHash = "(0x)?[a-zA-Z0-9]{64}$"; private NodeInfoService nodeInfoService; private Wallet wallet; + private Manager manager; public TronJsonRpcImpl() { } - public TronJsonRpcImpl(NodeInfoService nodeInfoService, Wallet wallet) { + public TronJsonRpcImpl(NodeInfoService nodeInfoService, Wallet wallet, Manager manager) { this.nodeInfoService = nodeInfoService; this.wallet = wallet; + this.manager = manager; } @Override @@ -288,28 +293,12 @@ private String call(byte[] ownerAddressByte, byte[] contractAddressByte, byte[] } @Override - public String getTrc20Balance(String ownerAddress, String contractAddress, - String blockNumOrTag) { - //某个用户拥有的某个token20余额,带精度 - byte[] addressData = ByteArray.fromHexString(ownerAddress); - //byte[] addressData = Commons.decodeFromBase58Check(ownerAddress); - - //生成dataStr - byte[] addressDataWord = new byte[32]; - System.arraycopy(addressData, 0, addressDataWord, 32 - addressData.length, addressData.length); - String dataStr = balanceOfTopic + Hex.toHexString(addressDataWord); - - String result = call(addressData, ByteArray.fromHexString(contractAddress), - ByteArray.fromHexString(dataStr)); - - if (Objects.isNull(result)) { - return "0x0"; - } - if (result.length() > 64) { - result = result.substring(0, 64); - } - - return ByteArray.toJsonHex(ByteUtil.stripLeadingZeroes(ByteArray.fromHexString(result))); + public String getStorageAt(String address, String storageIdx, String blockNumOrTag) { + byte[] addressByte = ByteArray.fromHexString(address); + StorageRowStore store = manager.getStorageRowStore(); + Storage storage = new Storage(addressByte, store); + DataWord value = storage.getValue(new DataWord(ByteArray.fromHexString(storageIdx))); + return value == null ? null : ByteArray.toJsonHex(value.getData()); } @Override @@ -525,6 +514,24 @@ private String generateCallParameter() { return sb.toString(); } + private String generateStorageParameter() { + String contractAddress = "41E94EAD5F4CA072A25B2E5500934709F1AEE3C64B";// nile合约:TXEphLzyv5jFwvjzwMok9UoehaSn294ZhN + + String sendAddress = "41F0CC5A2A84CD0F68ED1667070934542D673ACBD8"; // nile测试环境:TXvRyjomvtNWSKvNouTvAedRGD4w9RXLZD + String index = "01"; + byte[] byte1 = new DataWord(new DataWord(sendAddress).getLast20Bytes()).getData(); + byte[] byte2 = new DataWord(new DataWord(index).getLast20Bytes()).getData(); + byte[] byte3 = ByteUtil.merge(byte1, byte2); + String position = ByteArray.toJsonHex(Hash.sha3(byte3)); + + StringBuffer sb = new StringBuffer( + "{\"jsonrpc\":\"2.0\",\"method\":\"eth_getStorageAt\",\"params\":[\"0x"); + sb.append(contractAddress + "\",\""); + sb.append(position + "\","); + sb.append("\"latest\"],\"id\":1}"); + return sb.toString(); + } + @Override public String getPeerCount() { //返回当前节点所连接的peer节点数量 @@ -590,5 +597,6 @@ public boolean isMining() { public static void main(String[] args) { TronJsonRpcImpl impl = new TronJsonRpcImpl(); System.out.println(impl.generateCallParameter()); + System.out.println(impl.generateStorageParameter()); } } From 740c965391da89010f313928a83cedc6056192ea Mon Sep 17 00:00:00 2001 From: "federico.zhen" Date: Fri, 18 Jun 2021 11:02:05 +0800 Subject: [PATCH 039/341] add the witness address check --- .../java/org/tron/core/services/jsonrpc/TronJsonRpc.java | 6 +++++- .../org/tron/core/services/jsonrpc/TronJsonRpcImpl.java | 5 ++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 52fd84d0769..14f6361b7e4 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -277,7 +277,11 @@ public String toString() { Object isSyncing(); @JsonRpcMethod("eth_coinbase") - String getCoinbase(); + @JsonRpcErrors({ + @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{invalid " + + "witness address}"), + }) + String getCoinbase() throws Exception; @JsonRpcMethod("eth_gasPrice") String gasPrice(); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index f83eae243f4..6d9b479a745 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -305,7 +305,7 @@ public String getStorageAt(String address, String storageIdx, String blockNumOrT public String getSendTransactionCountOfAddress(String address, String blockNumOrTag) { //发起人为某个地址的交易总数。FullNode无法实现该功能 return ByteArray.toJsonHex( - wallet.getNowBlock().getBlockHeader().getRawData().getTimestamp() + 86400 * 1000); + wallet.getNowBlock().getBlockHeader().getRawData().getTimestamp() + 60 * 1000); } @Override @@ -328,6 +328,9 @@ public String getCoinbase() { //获取最新块的产块sr地址 byte[] witnessAddress = wallet.getNowBlock().getBlockHeader().getRawData().getWitnessAddress() .toByteArray(); + if (witnessAddress == null || witnessAddress.length != 21) { + throw new JsonRpcApiException("invalid witness address"); + } return ByteArray.toJsonHex(witnessAddress); } From 3876c41cb9072d0ce4e2fa27f5cd966437a36e69 Mon Sep 17 00:00:00 2001 From: "federico.zhen" Date: Fri, 18 Jun 2021 11:29:51 +0800 Subject: [PATCH 040/341] add the eth_accounts api --- .../java/org/tron/core/services/jsonrpc/TronJsonRpc.java | 2 ++ .../java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 14f6361b7e4..2ac3016d033 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -331,4 +331,6 @@ public String toString() { @JsonRpcMethod("eth_mining") boolean isMining(); + @JsonRpcMethod("eth_accounts") + String[] getAccounts(); } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 6d9b479a745..6e08bdb89ec 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -597,6 +597,11 @@ public boolean isMining() { return false; } + @Override + public String[] getAccounts() { + return new String[0]; + } + public static void main(String[] args) { TronJsonRpcImpl impl = new TronJsonRpcImpl(); System.out.println(impl.generateCallParameter()); From 5e15d2d217db96c804366d84bef5811f8bf00b8a Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Mon, 21 Jun 2021 17:56:57 +0800 Subject: [PATCH 041/341] feat: add param check --- .../java/org/tron/common/utils/ByteArray.java | 25 ++- .../core/services/jsonrpc/JsonRpcApiUtil.java | 16 +- .../core/services/jsonrpc/TronJsonRpc.java | 42 +++- .../services/jsonrpc/TronJsonRpcImpl.java | 212 +++++++++++++----- 4 files changed, 216 insertions(+), 79 deletions(-) diff --git a/common/src/main/java/org/tron/common/utils/ByteArray.java b/common/src/main/java/org/tron/common/utils/ByteArray.java index 71ed3a4d1c5..87781487f41 100644 --- a/common/src/main/java/org/tron/common/utils/ByteArray.java +++ b/common/src/main/java/org/tron/common/utils/ByteArray.java @@ -132,15 +132,22 @@ public static BigInteger hexToBigInteger(String input) { } } - /** - * Generate a subarray of a given byte array. - * - * @param input the input byte array - * @param start the start index - * @param end the end index - * @return a subarray of input, ranging from start (inclusively) to end - * (exclusively) - */ + public static int jsonHexToInt(String x) throws Exception { + if (!x.startsWith("0x")) + throw new Exception("Incorrect hex syntax"); + x = x.substring(2); + return Integer.parseInt(x, 16); + } + + /** + * Generate a subarray of a given byte array. + * + * @param input the input byte array + * @param start the start index + * @param end the end index + * @return a subarray of input, ranging from start (inclusively) to end + * (exclusively) + */ public static byte[] subArray(byte[] input, int start, int end) { byte[] result = new byte[end - start]; System.arraycopy(input, start, result, 0, end - start); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index 64c495e5b29..ef930fdcd36 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -333,14 +333,14 @@ public static long getTransactionAmount(Transaction.Contract contract, String ha amount = 1024_000_000L; break; case ParticipateAssetIssueContract: - // long token = DataImporter.getTokenID(blockNum, - // contractParameter.unpack(ParticipateAssetIssueContract.class).getAssetName()); - // //获取token的比例,计算出10币的数量 - // long trxNum = contractParameter.unpack(ParticipateAssetIssueContract.class).getAmount(); - // Token10Entity entity = DataImporter.getTokenEntity(token); - // long exchangeAmount = Math.multiplyExact(trxNum, entity.getNum()); - // exchangeAmount = Math.floorDiv(exchangeAmount, entity.getTrxNum()); - // amount = exchangeAmount; + // long token = DataImporter.getTokenID(blockNum, + // contractParameter.unpack(ParticipateAssetIssueContract.class).getAssetName()); + // //获取token的比例,计算出10币的数量 + // long trxNum = contractParameter.unpack(ParticipateAssetIssueContract.class).getAmount(); + // Token10Entity entity = DataImporter.getTokenEntity(token); + // long exchangeAmount = Math.multiplyExact(trxNum, entity.getNum()); + // exchangeAmount = Math.floorDiv(exchangeAmount, entity.getTrxNum()); + // amount = exchangeAmount; break; case FreezeBalanceContract: amount = contractParameter.unpack(FreezeBalanceContract.class).getFrozenBalance(); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 2ac3016d033..93ca5c2da8f 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -182,14 +182,14 @@ public TransactionResult(Block b, int index, Transaction tx, Wallet wallet) { to = ByteArray.toJsonHex(toByte); value = ByteArray.toJsonHex(getTransactionAmount(contract, hash, wallet)); } else { - from = ""; - to = ""; - value = ""; + from = null; + to = null; + value = null; } - gas = ""; - gasPrice = ""; - input = ""; + gas = null; // no value + gasPrice = null; // no value + input = null; // no value ByteString signature = tx.getSignature(0); // r[32] + s[32] + 符号位v[1] byte[] signData = signature.toByteArray(); @@ -262,24 +262,32 @@ public String toString() { String getLatestBlockNum(); @JsonRpcMethod("eth_getBalance") + @JsonRpcErrors({ + @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{}"), + }) String getTrxBalance(String address, String blockNumOrTag) throws ItemNotFoundException; @JsonRpcMethod("eth_getStorageAt") + @JsonRpcErrors({ + @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{}"), + }) String getStorageAt(String address, String storageIdx, String blockNumOrTag); @JsonRpcMethod("eth_getTransactionCount") String getSendTransactionCountOfAddress(String address, String blockNumOrTag); @JsonRpcMethod("eth_getCode") - String getABIofSmartContract(String contractAddress); + @JsonRpcErrors({ + @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{}"), + }) + String getABIofSmartContract(String contractAddress, String bnOrId); @JsonRpcMethod("eth_syncing") Object isSyncing(); @JsonRpcMethod("eth_coinbase") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{invalid " - + "witness address}"), + @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{}"), }) String getCoinbase() throws Exception; @@ -287,24 +295,36 @@ public String toString() { String gasPrice(); @JsonRpcMethod("eth_estimateGas") - String estimateGas(); + String estimateGas(CallArguments args); @JsonRpcMethod("eth_getCompilers") String[] getCompilers(); @JsonRpcMethod("eth_getTransactionByHash") + @JsonRpcErrors({ + @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{}"), + }) TransactionResult getTransactionByHash(String txid); @JsonRpcMethod("eth_getTransactionByBlockHashAndIndex") + @JsonRpcErrors({ + @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{}"), + }) TransactionResult getTransactionByBlockHashAndIndex(String blockHash, String index); @JsonRpcMethod("eth_getTransactionByBlockNumberAndIndex") + @JsonRpcErrors({ + @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{}"), + }) TransactionResult getTransactionByBlockNumberAndIndex(String blockNumOrTag, String index); - @JsonRpcMethod("eth_gettransactionreceipt") + @JsonRpcMethod("eth_getTransactionReceipt") TransactionReceipt getTransactionReceipt(String txid); @JsonRpcMethod("eth_call") + @JsonRpcErrors({ + @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{}"), + }) String getCall(CallArguments transactionCall, String blockNumOrTag); @JsonRpcMethod("net_peerCount") diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 6e08bdb89ec..edf9cc40b51 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -51,6 +51,7 @@ public class TronJsonRpcImpl implements TronJsonRpc { String regexHash = "(0x)?[a-zA-Z0-9]{64}$"; + String regexAddressHash = "(0x)?[a-zA-Z0-9]{42}$"; private NodeInfoService nodeInfoService; private Wallet wallet; @@ -134,7 +135,21 @@ private byte[] hashToByteArray(String hash) { return bHash; } - private Block getBlockByJsonHash(String blockHash) throws Exception { + private byte[] addressHashToByteArray(String hash) { + if (!Pattern.matches(regexAddressHash, hash)) { + throw new JsonRpcApiException("invalid address hash value"); + } + + byte[] bHash; + try { + bHash = ByteArray.fromHexString(hash); + } catch (Exception e) { + throw new JsonRpcApiException(e.getMessage()); + } + return bHash; + } + + private Block getBlockByJsonHash(String blockHash) { byte[] bHash = hashToByteArray(blockHash); return wallet.getBlockById(ByteString.copyFrom(bHash)); } @@ -184,14 +199,6 @@ private BlockResult getBlockResult(Block block, boolean fullTx) { return br; } - public String ethCall(CallArguments args, String bnOrId) throws Exception { - //静态调用合约方法。 - byte[] addressData = Commons.decodeFromBase58Check(args.from); - byte[] contractAddressData = Commons.decodeFromBase58Check(args.to); - - return call(addressData, contractAddressData, ByteArray.fromHexString(args.data)); - } - @Override public String getNetVersion() { //当前链的id,不能跟metamask已有的id冲突 @@ -218,11 +225,30 @@ public String getLatestBlockNum() { @Override public String getTrxBalance(String address, String blockNumOrTag) { - //某个用户的trx余额,以sun为单位 - byte[] addressData = ByteArray.fromHexString(address); - Account account = Account.newBuilder().setAddress(ByteString.copyFrom(addressData)).build(); - long balance = wallet.getAccount(account).getBalance(); - return ByteArray.toJsonHex(balance); + if ("earliest".equalsIgnoreCase(blockNumOrTag) + || "pending".equalsIgnoreCase(blockNumOrTag)) { + throw new JsonRpcApiException("TAG [earliest | pending] not supported"); + } else if ("latest".equalsIgnoreCase(blockNumOrTag)) { + //某个用户的trx余额,以sun为单位 + byte[] addressData = addressHashToByteArray(address); + + Account account = Account.newBuilder().setAddress(ByteString.copyFrom(addressData)).build(); + Account reply = wallet.getAccount(account); + long balance = 0; + + if (reply != null) { + balance = reply.getBalance(); + } + return ByteArray.toJsonHex(balance); + } else { + try { + ByteArray.hexToBigInteger(blockNumOrTag); + } catch (Exception e) { + throw new JsonRpcApiException("invalid block number"); + } + + throw new JsonRpcApiException("QUANTITY not supported, just support TAG as latest"); + } } /** @@ -294,11 +320,26 @@ private String call(byte[] ownerAddressByte, byte[] contractAddressByte, byte[] @Override public String getStorageAt(String address, String storageIdx, String blockNumOrTag) { - byte[] addressByte = ByteArray.fromHexString(address); - StorageRowStore store = manager.getStorageRowStore(); - Storage storage = new Storage(addressByte, store); - DataWord value = storage.getValue(new DataWord(ByteArray.fromHexString(storageIdx))); - return value == null ? null : ByteArray.toJsonHex(value.getData()); + if ("earliest".equalsIgnoreCase(blockNumOrTag) + || "pending".equalsIgnoreCase(blockNumOrTag)) { + throw new JsonRpcApiException("TAG [earliest | pending] not supported"); + } else if ("latest".equalsIgnoreCase(blockNumOrTag)) { + byte[] addressByte = addressHashToByteArray(address); + + StorageRowStore store = manager.getStorageRowStore(); + Storage storage = new Storage(addressByte, store); + + DataWord value = storage.getValue(new DataWord(ByteArray.fromHexString(storageIdx))); + return value == null ? null : ByteArray.toJsonHex(value.getData()); + } else { + try { + ByteArray.hexToBigInteger(blockNumOrTag); + } catch (Exception e) { + throw new JsonRpcApiException("invalid block number"); + } + + throw new JsonRpcApiException("QUANTITY not supported, just support TAG as latest"); + } } @Override @@ -309,13 +350,33 @@ public String getSendTransactionCountOfAddress(String address, String blockNumOr } @Override - public String getABIofSmartContract(String contractAddress) { - //获取某个合约地址的字节码 - byte[] addressData = ByteArray.fromHexString(contractAddress); - BytesMessage.Builder build = BytesMessage.newBuilder(); - BytesMessage bytesMessage = build.setValue(ByteString.copyFrom(addressData)).build(); - SmartContract smartContract = wallet.getContract(bytesMessage); - return ByteArray.toJsonHex(smartContract.getBytecode().toByteArray()); + public String getABIofSmartContract(String contractAddress, String blockNumOrTag) { + if ("earliest".equalsIgnoreCase(blockNumOrTag) + || "pending".equalsIgnoreCase(blockNumOrTag)) { + throw new JsonRpcApiException("TAG [earliest | pending] not supported"); + } else if ("latest".equalsIgnoreCase(blockNumOrTag)) { + //获取某个合约地址的字节码 + byte[] addressData = addressHashToByteArray(contractAddress); + + BytesMessage.Builder build = BytesMessage.newBuilder(); + BytesMessage bytesMessage = build.setValue(ByteString.copyFrom(addressData)).build(); + SmartContract smartContract = wallet.getContract(bytesMessage); + + if (smartContract != null) { + return ByteArray.toJsonHex(smartContract.getBytecode().toByteArray()); + } else { + return "0x"; + } + + } else { + try { + ByteArray.hexToBigInteger(blockNumOrTag); + } catch (Exception e) { + throw new JsonRpcApiException("invalid block number"); + } + + throw new JsonRpcApiException("QUANTITY not supported, just support TAG as latest"); + } } @Override @@ -348,7 +409,7 @@ public String gasPrice() { } @Override - public String estimateGas() { + public String estimateGas(CallArguments args) { BigInteger feeLimit = BigInteger.valueOf(100); // set fee limit: 100 trx BigInteger precision = new BigInteger("1000000000000000000"); // 1ether = 10^18 wei BigInteger gasPrice = new BigInteger(gasPrice().substring(2), 16); @@ -366,24 +427,49 @@ public String[] getCompilers() { @Override public TransactionResult getTransactionByHash(String txid) { - Transaction transaction = wallet - .getTransactionById(ByteString.copyFrom(ByteArray.fromHexString(txid))); + byte[] txHash = hashToByteArray(txid); + TransactionInfo transactionInfo = wallet - .getTransactionInfoById(ByteString.copyFrom(ByteArray.fromHexString(txid))); - if (transaction == null || transactionInfo == null) { + .getTransactionInfoById(ByteString.copyFrom(txHash)); + if (transactionInfo == null) { return null; } + long blockNum = transactionInfo.getBlockNumber(); Block block = wallet.getBlockByNum(blockNum); if (block == null) { return null; } - return formatRpcTransaction(transaction, block); + + return formatRpcTransaction(transactionInfo, block); + } + + private TransactionResult formatRpcTransaction(TransactionInfo transactioninfo, Block block) { + String txid = ByteArray.toHexString(transactioninfo.getId().toByteArray()); + + Transaction transaction = null; + int transactionIndex = -1; + + List txList = block.getTransactionsList(); + for (int index = 0; index < txList.size(); index++) { + transaction = txList.get(index); + if (getTxID(transaction).equals(txid)) { + transactionIndex = index; + break; + } + } + + if (transactionIndex == -1) { + return null; + } + + return new TransactionResult(block, transactionIndex, transaction, wallet); } private TransactionResult formatRpcTransaction(Transaction transaction, Block block) { String txid = ByteArray.toHexString( new TransactionCapsule(transaction).getTransactionId().getBytes()); + int transactionIndex = -1; for (int index = 0; index < block.getTransactionsCount(); index++) { if (getTxID(block.getTransactions(index)).equals(txid)) { @@ -391,21 +477,34 @@ private TransactionResult formatRpcTransaction(Transaction transaction, Block bl break; } } + return new TransactionResult(block, transactionIndex, transaction, wallet); } + public TransactionResult getTransactionByBlockAndIndex(Block block, String index) { + int txIndex; + try { + txIndex = ByteArray.jsonHexToInt(index); + } catch (Exception e) { + throw new JsonRpcApiException("invalid index value"); + } + + if (txIndex >= block.getTransactionsCount()) { + return null; + } + Transaction transaction = block.getTransactions(txIndex); + return new TransactionResult(block, txIndex, transaction, wallet); + } + @Override public TransactionResult getTransactionByBlockHashAndIndex(String blockHash, String index) { - Block block = wallet.getBlockById(ByteString.copyFrom(ByteArray.fromHexString(blockHash))); + final Block block = getBlockByJsonHash(blockHash); + if (block == null) { return null; } - int txIndex = ByteArray.hexToBigInteger(index).intValue(); - if (txIndex > block.getTransactionsCount() - 1) { - return null; - } - Transaction transaction = block.getTransactions(txIndex); - return formatRpcTransaction(transaction, block); + + return getTransactionByBlockAndIndex(block, index); } @Override @@ -414,12 +513,8 @@ public TransactionResult getTransactionByBlockNumberAndIndex(String blockNumOrTa if (block == null) { return null; } - int txIndex = ByteArray.hexToBigInteger(index).intValue(); - if (txIndex > block.getTransactionsCount() - 1) { - return null; - } - Transaction transaction = block.getTransactions(txIndex); - return formatRpcTransaction(transaction, block); + + return getTransactionByBlockAndIndex(block, index); } @Override @@ -488,11 +583,24 @@ public TransactionReceipt getTransactionReceipt(String txid) { @Override public String getCall(CallArguments transactionCall, String blockNumOrTag) { - //静态调用合约方法。 - byte[] addressData = ByteArray.fromHexString(transactionCall.from); - byte[] contractAddressData = ByteArray.fromHexString(transactionCall.to); + if ("earliest".equalsIgnoreCase(blockNumOrTag) + || "pending".equalsIgnoreCase(blockNumOrTag)) { + throw new JsonRpcApiException("TAG [earliest | pending] not supported"); + } else if ("latest".equalsIgnoreCase(blockNumOrTag)) { + //静态调用合约方法。 + byte[] addressData = addressHashToByteArray(transactionCall.from); + byte[] contractAddressData = addressHashToByteArray(transactionCall.to); + + return call(addressData, contractAddressData, ByteArray.fromHexString(transactionCall.data)); + } else { + try { + ByteArray.hexToBigInteger(blockNumOrTag).longValue(); + } catch (Exception e) { + throw new JsonRpcApiException("invalid block number"); + } - return call(addressData, contractAddressData, ByteArray.fromHexString(transactionCall.data)); + throw new JsonRpcApiException("QUANTITY not supported, just support TAG as latest"); + } } //生成一个调用 eth_call api的参数,可以自由修改 @@ -518,9 +626,11 @@ private String generateCallParameter() { } private String generateStorageParameter() { - String contractAddress = "41E94EAD5F4CA072A25B2E5500934709F1AEE3C64B";// nile合约:TXEphLzyv5jFwvjzwMok9UoehaSn294ZhN + // nile合约:TXEphLzyv5jFwvjzwMok9UoehaSn294ZhN + String contractAddress = "41E94EAD5F4CA072A25B2E5500934709F1AEE3C64B"; - String sendAddress = "41F0CC5A2A84CD0F68ED1667070934542D673ACBD8"; // nile测试环境:TXvRyjomvtNWSKvNouTvAedRGD4w9RXLZD + // nile测试环境:TXvRyjomvtNWSKvNouTvAedRGD4w9RXLZD + String sendAddress = "41F0CC5A2A84CD0F68ED1667070934542D673ACBD8"; String index = "01"; byte[] byte1 = new DataWord(new DataWord(sendAddress).getLast20Bytes()).getData(); byte[] byte2 = new DataWord(new DataWord(index).getLast20Bytes()).getData(); From 0f00e39f4db00fd9bad8e86f7f4db0f7420e82bb Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Tue, 22 Jun 2021 18:13:55 +0800 Subject: [PATCH 042/341] compatible with address whthout 41 ahead --- .../services/jsonrpc/TronJsonRpcImpl.java | 45 ++++++++++++++++--- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index edf9cc40b51..fb098b2a7bf 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -29,6 +29,7 @@ import org.tron.common.utils.ByteArray; import org.tron.common.utils.ByteUtil; import org.tron.common.utils.Commons; +import org.tron.common.utils.DecodeUtil; import org.tron.core.Wallet; import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.TransactionCapsule; @@ -136,13 +137,20 @@ private byte[] hashToByteArray(String hash) { } private byte[] addressHashToByteArray(String hash) { - if (!Pattern.matches(regexAddressHash, hash)) { - throw new JsonRpcApiException("invalid address hash value"); - } +// if (!Pattern.matches(regexAddressHash, hash)) { +// throw new JsonRpcApiException("invalid address hash value"); +// } byte[] bHash; try { bHash = ByteArray.fromHexString(hash); + if (bHash.length != DecodeUtil.ADDRESS_SIZE / 2 + && bHash.length != DecodeUtil.ADDRESS_SIZE / 2 - 1) { + throw new JsonRpcApiException("invalid address hash value"); + } + if (bHash.length == DecodeUtil.ADDRESS_SIZE/2 - 1) { + bHash = ByteUtil.merge(new byte[] {DecodeUtil.addressPreFixByte}, bHash); + } } catch (Exception e) { throw new JsonRpcApiException(e.getMessage()); } @@ -604,7 +612,7 @@ public String getCall(CallArguments transactionCall, String blockNumOrTag) { } //生成一个调用 eth_call api的参数,可以自由修改 - private String generateCallParameter() { + private String generateCallParameter1() { String ownerAddress = "TXvRyjomvtNWSKvNouTvAedRGD4w9RXLZD"; String usdjAddress = "TLBaRhANQoJFTqre9Nf1mjuwNWjCJeYqUL"; // nile测试环境udsj地址 @@ -615,8 +623,30 @@ private String generateCallParameter() { String data = getMethodSign("balanceOf(address)") + Hex.toHexString(addressDataWord); CallArguments transactionCall = new CallArguments(); - transactionCall.from = ownerAddress; - transactionCall.to = usdjAddress; + transactionCall.from = ByteArray.toHexString(Commons.decodeFromBase58Check(ownerAddress)); + transactionCall.to = ByteArray.toHexString(Commons.decodeFromBase58Check(usdjAddress)); + transactionCall.data = data; + + StringBuffer sb = new StringBuffer("{\"jsonrpc\":\"2.0\",\"method\":\"eth_call\",\"params\":["); + sb.append(transactionCall); + sb.append(", \"latest\"],\"id\":1}"); + return sb.toString(); + } + + //生成一个调用 eth_call api的参数,可以自由修改 + private String generateCallParameter2() { + String ownerAddress = "TRXPT6Ny7EFvTPv7mFUqaFUST39WUZ4zzz"; + String usdjAddress = "TXYZopYRdj2D9XRtbG411XZZ3kM5VkAeBf"; // nile测试环境udsj地址 + + byte[] addressData = Commons.decodeFromBase58Check(ownerAddress); + byte[] addressDataWord = new byte[32]; + System.arraycopy(Commons.decodeFromBase58Check(ownerAddress), 0, addressDataWord, + 32 - addressData.length, addressData.length); + String data = getMethodSign("name()"); + + CallArguments transactionCall = new CallArguments(); + transactionCall.from = ByteArray.toHexString(Commons.decodeFromBase58Check(ownerAddress)); + transactionCall.to = ByteArray.toHexString(Commons.decodeFromBase58Check(usdjAddress)); transactionCall.data = data; StringBuffer sb = new StringBuffer("{\"jsonrpc\":\"2.0\",\"method\":\"eth_call\",\"params\":["); @@ -714,7 +744,8 @@ public String[] getAccounts() { public static void main(String[] args) { TronJsonRpcImpl impl = new TronJsonRpcImpl(); - System.out.println(impl.generateCallParameter()); + System.out.println(impl.generateCallParameter1()); + System.out.println(impl.generateCallParameter2()); System.out.println(impl.generateStorageParameter()); } } From 1a6b30237c8318e618c9ad7fe9d9b53ba6f87371 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Tue, 22 Jun 2021 22:22:17 +0800 Subject: [PATCH 043/341] feat: modify getTransactionReceipt --- .../common/parameter/CommonParameter.java | 4 + .../src/main/java/org/tron/core/Constant.java | 1 + .../src/main/java/org/tron/core/Wallet.java | 4 + .../java/org/tron/core/config/args/Args.java | 6 ++ .../core/services/jsonrpc/JsonRpcApiUtil.java | 20 +++++ .../core/services/jsonrpc/TronJsonRpc.java | 86 ++++++++++++++++++- .../services/jsonrpc/TronJsonRpcImpl.java | 64 ++------------ 7 files changed, 127 insertions(+), 58 deletions(-) diff --git a/common/src/main/java/org/tron/common/parameter/CommonParameter.java b/common/src/main/java/org/tron/common/parameter/CommonParameter.java index 91b6ad891e5..ada58dbb24e 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -3,6 +3,7 @@ import com.beust.jcommander.Parameter; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Set; import lombok.Getter; import lombok.Setter; @@ -173,6 +174,9 @@ public class CommonParameter { public int jsonRpcHttpPort; @Getter @Setter + public String energyCost; + @Getter + @Setter @Parameter(names = {"--rpc-thread"}, description = "Num of gRPC thread") public int rpcThreadNum; @Getter diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index 960b0d03dbc..0234af403da 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -96,6 +96,7 @@ public class Constant { public static final String NODE_HTTP_PBFT_PORT = "node.http.PBFTPort"; public static final String NODE_HTTP_JSONRPC_PORT = "node.http.jsonRpcPort"; public static final String NODE_HTTP_JSONRPC_ENABLE = "node.http.jsonRpcEnable"; + public static final String NODE_ENERGY_COST = "node.http.energyCost"; public static final String NODE_RPC_THREAD = "node.rpc.thread"; public static final String NODE_SOLIDITY_THREADS = "node.solidity.threads"; diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index 26d353304f9..352d42254b7 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -3784,5 +3784,9 @@ public void checkAccountIdentifier(BalanceContract.AccountIdentifier accountIden throw new IllegalArgumentException("account_identifier address is null"); } } + + public long getEnergyFee() { + return chainBaseManager.getDynamicPropertiesStore().getEnergyFee(); + } } diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index cf92fd817c8..fcaad2afc9c 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -23,6 +23,7 @@ import java.util.Collections; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.concurrent.BlockingQueue; @@ -133,6 +134,7 @@ public static void clearParam() { PARAMETER.solidityHttpPort = 0; PARAMETER.pBFTHttpPort = 0; PARAMETER.jsonRpcHttpPort = 0; + PARAMETER.energyCost = ""; PARAMETER.maintenanceTimeInterval = 0; PARAMETER.proposalExpireTime = 0; PARAMETER.checkFrozenTime = 1; @@ -460,6 +462,10 @@ public static void setParam(final String[] args, final String confFileName) { config.hasPath(Constant.NODE_HTTP_JSONRPC_PORT) ? config.getInt(Constant.NODE_HTTP_JSONRPC_PORT) : 8093; + PARAMETER.energyCost = + config.hasPath(Constant.NODE_ENERGY_COST) + ? config.getString(Constant.NODE_ENERGY_COST) : "27553334:140,25304425:40,0:10"; + PARAMETER.rpcThreadNum = config.hasPath(Constant.NODE_RPC_THREAD) ? config.getInt(Constant.NODE_RPC_THREAD) : (Runtime.getRuntime().availableProcessors() + 1) / 2; diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index ef930fdcd36..bff18d0cb98 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -12,6 +12,7 @@ import org.spongycastle.util.encoders.Hex; import org.tron.api.GrpcAPI.AssetIssueList; import org.tron.common.crypto.Hash; +import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.ByteArray; import org.tron.common.utils.Commons; import org.tron.common.utils.Sha256Hash; @@ -454,4 +455,23 @@ public static long getUnfreezeAssetAmount(byte[] addressBytes, Wallet wallet) { } return amount; } + + public static long calEngergyFee(long blockNum, Wallet wallet) { + String energyCost = CommonParameter.getInstance().getEnergyCost(); + if (energyCost.isEmpty()) { + return wallet.getEnergyFee(); + } else { + String[] costList = energyCost.split(","); + for (String data : costList) { + String[] costStrArray = data.split(":"); + long num = Long.parseLong(costStrArray[0]); + long cost = Long.parseLong(costStrArray[1]); + if (blockNum >= num) { + return cost; + } + } + + return wallet.getEnergyFee(); + } + } } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 93ca5c2da8f..b6c1d31ec47 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -1,5 +1,6 @@ package org.tron.core.services.jsonrpc; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.convertToTronAddress; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getToAddress; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTransactionAmount; @@ -7,19 +8,25 @@ import com.googlecode.jsonrpc4j.JsonRpcError; import com.googlecode.jsonrpc4j.JsonRpcErrors; import com.googlecode.jsonrpc4j.JsonRpcMethod; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import lombok.AllArgsConstructor; import lombok.ToString; import lombok.Value; import org.springframework.stereotype.Component; +import org.tron.api.GrpcAPI.TransactionInfoList; import org.tron.common.utils.ByteArray; +import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.TransactionCapsule; import org.tron.core.exception.ItemNotFoundException; import org.tron.protos.Protocol.Block; +import org.tron.protos.Protocol.ResourceReceipt; import org.tron.protos.Protocol.Transaction; import org.tron.protos.Protocol.Transaction.Contract; +import org.tron.protos.Protocol.TransactionInfo; @Component public interface TronJsonRpc { @@ -118,7 +125,6 @@ public static class TransactionLog { public String transactionIndex; public String transactionHash; public String address; - public String addressBase58; public String data; public String[] topics; @@ -143,6 +149,81 @@ public TransactionLog() { public TransactionReceipt() { } + + public TransactionReceipt(Block block, TransactionInfo txInfo, Wallet wallet) { + BlockCapsule blockCapsule = new BlockCapsule(block); + String txid = ByteArray.toHexString(txInfo.getId().toByteArray()); + + Transaction transaction = null; + long cumulativeGas = 0; + + long sunPerEnergy = Constant.SUN_PER_ENERGY; + long dynamicEnergyFee = wallet.getEnergyFee(); + if (dynamicEnergyFee > 0) { + sunPerEnergy = dynamicEnergyFee; + } + + TransactionInfoList infoList = wallet.getTransactionInfoByBlockNum(blockCapsule.getNum()); + for (int index = 0; index < infoList.getTransactionInfoCount(); index++) { + TransactionInfo info = infoList.getTransactionInfo(index); + ResourceReceipt resourceReceipt = info.getReceipt(); + + long energyUsage = resourceReceipt.getEnergyUsage() + + resourceReceipt.getEnergyFee() / sunPerEnergy; + cumulativeGas += energyUsage; + + if (ByteArray.toHexString(info.getId().toByteArray()).equals(txid)) { + transactionIndex = ByteArray.toJsonHex(index); + cumulativeGasUsed = ByteArray.toJsonHex(cumulativeGas); + gasUsed = ByteArray.toJsonHex(energyUsage); + + transaction = block.getTransactions(index); + break; + } + } + + blockHash = ByteArray.toJsonHex(blockCapsule.getBlockId().getBytes()); + blockNumber = ByteArray.toJsonHex(blockCapsule.getNum()); + transactionHash = ByteArray.toJsonHex(txInfo.getId().toByteArray()); + + if (transaction != null && !transaction.getRawData().getContractList().isEmpty()) { + Contract contract = transaction.getRawData().getContract(0); + byte[] fromByte = TransactionCapsule.getOwner(contract); + byte[] toByte = getToAddress(transaction); + from = ByteArray.toJsonHex(fromByte); + to = ByteArray.toJsonHex(toByte); + } else { + from = null; + to = null; + } + + contractAddress = ByteArray.toJsonHex(txInfo.getContractAddress().toByteArray()); + + // 统一的log + List logList = new ArrayList<>(); + for (int index = 0; index < txInfo.getLogCount(); index++) { + TransactionInfo.Log log = txInfo.getLogList().get(index); + + TransactionReceipt.TransactionLog transactionLog = new TransactionReceipt.TransactionLog(); + transactionLog.logIndex = ByteArray.toJsonHex(index + 1); //log的索引从1开始 + transactionLog.transactionHash = txid; + transactionLog.transactionIndex = transactionIndex; + transactionLog.blockHash = blockHash; + transactionLog.blockNumber = blockNumber; + byte[] addressByte = convertToTronAddress(log.getAddress().toByteArray()); + transactionLog.address = ByteArray.toJsonHex(addressByte); + transactionLog.data = ByteArray.toJsonHex(log.getData().toByteArray()); + String[] topics = new String[log.getTopicsCount()]; + for (int i = 0; i < log.getTopicsCount(); i++) { + topics[i] = ByteArray.toJsonHex(log.getTopics(i).toByteArray()); + } + transactionLog.topics = topics; + + logList.add(transactionLog); + } + logs = logList.toArray(new TransactionReceipt.TransactionLog[logList.size()]); + logsBloom = null; // no value + } } class TransactionResult { @@ -319,6 +400,9 @@ public String toString() { TransactionResult getTransactionByBlockNumberAndIndex(String blockNumOrTag, String index); @JsonRpcMethod("eth_getTransactionReceipt") + @JsonRpcErrors({ + @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{}"), + }) TransactionReceipt getTransactionReceipt(String txid); @JsonRpcMethod("eth_call") diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index edf9cc40b51..6f1855e7cc7 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -2,9 +2,6 @@ import static org.tron.core.Wallet.CONTRACT_VALIDATE_ERROR; import static org.tron.core.Wallet.CONTRACT_VALIDATE_EXCEPTION; -import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.convertToTronAddress; -import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.encode58Check; -import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.generateContractAddress; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getMethodSign; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTxID; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.triggerCallContract; @@ -23,7 +20,6 @@ import org.tron.api.GrpcAPI.Return; import org.tron.api.GrpcAPI.Return.response_code; import org.tron.api.GrpcAPI.TransactionExtention; -import org.tron.api.GrpcAPI.TransactionInfoList; import org.tron.common.crypto.Hash; import org.tron.common.runtime.vm.DataWord; import org.tron.common.utils.ByteArray; @@ -519,66 +515,20 @@ public TransactionResult getTransactionByBlockNumberAndIndex(String blockNumOrTa @Override public TransactionReceipt getTransactionReceipt(String txid) { - Transaction transaction = wallet - .getTransactionById(ByteString.copyFrom(ByteArray.fromHexString(txid))); - TransactionInfo transactionInfo = wallet - .getTransactionInfoById(ByteString.copyFrom(ByteArray.fromHexString(txid))); - if (transaction == null || transactionInfo == null) { + byte[] txHash = hashToByteArray(txid); + + TransactionInfo transactionInfo = wallet.getTransactionInfoById(ByteString.copyFrom(txHash)); + if (transactionInfo == null) { return null; } long blockNum = transactionInfo.getBlockNumber(); Block block = wallet.getBlockByNum(blockNum); - TransactionResult dto = formatRpcTransaction(transaction, block); - TransactionReceipt receipt = new TransactionReceipt(); - receipt.blockHash = dto.blockHash; - receipt.blockNumber = dto.blockNumber; - receipt.transactionIndex = dto.transactionIndex; - receipt.transactionHash = dto.hash; - receipt.from = dto.from; - receipt.to = dto.to; - - long cumulativeGasUsed = 0; - TransactionInfoList infoList = wallet.getTransactionInfoByBlockNum(blockNum); - for (TransactionInfo info : infoList.getTransactionInfoList()) { - cumulativeGasUsed += info.getFee(); - } - receipt.cumulativeGasUsed = ByteArray.toJsonHex(cumulativeGasUsed); - receipt.gasUsed = ByteArray.toJsonHex(transactionInfo.getFee()); - - String contractAddress = null; - if (transaction.getRawData().getContract(0).getType() == ContractType.CreateSmartContract) { - contractAddress = encode58Check(generateContractAddress(transaction)); - } - receipt.contractAddress = contractAddress; - - //统一的log - List logList = new ArrayList<>(); - for (int index = 0; index < transactionInfo.getLogCount(); index++) { - TransactionInfo.Log log = transactionInfo.getLogList().get(index); - - TransactionReceipt.TransactionLog transactionLog = new TransactionReceipt.TransactionLog(); - transactionLog.logIndex = ByteArray.toJsonHex(index + 1); //log的索引从1开始 - transactionLog.transactionHash = dto.hash; - transactionLog.transactionIndex = dto.transactionIndex; - transactionLog.blockHash = dto.blockHash; - transactionLog.blockNumber = dto.blockNumber; - byte[] addressByte = convertToTronAddress(log.getAddress().toByteArray()); - transactionLog.address = ByteArray.toJsonHex(addressByte); - transactionLog.addressBase58 = encode58Check(addressByte); - transactionLog.data = ByteArray.toJsonHex(log.getData().toByteArray()); - String[] topics = new String[log.getTopicsCount()]; - for (int i = 0; i < log.getTopicsCount(); i++) { - topics[i] = ByteArray.toJsonHex(log.getTopics(i).toByteArray()); - } - transactionLog.topics = topics; - - logList.add(transactionLog); + if (block == null) { + return null; } - receipt.logs = logList.toArray(new TransactionReceipt.TransactionLog[logList.size()]); - receipt.logsBloom = null; //暂时不填 - return receipt; + return new TransactionReceipt(block, transactionInfo, wallet); } @Override From 0c808c2d0722a5e08e1ede12a1faf443c8476afa Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 23 Jun 2021 11:55:55 +0800 Subject: [PATCH 044/341] fix: fix eth_call return result --- .../java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 87207332f83..963ff0da280 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -315,7 +315,7 @@ private String call(byte[] ownerAddressByte, byte[] contractAddressByte, byte[] for (ByteString bs : list) { listBytes = ByteUtil.merge(listBytes, bs.toByteArray()); } - result = Hex.toHexString(listBytes); + result = ByteArray.toHexString(listBytes); } else { logger.error("trigger contract failed."); } From 550849f911816f7c43cacf8c45c04a4ad4fb8d55 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 23 Jun 2021 11:58:36 +0800 Subject: [PATCH 045/341] fix: fix eth_call result --- .../java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 963ff0da280..25ca239215a 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -315,7 +315,7 @@ private String call(byte[] ownerAddressByte, byte[] contractAddressByte, byte[] for (ByteString bs : list) { listBytes = ByteUtil.merge(listBytes, bs.toByteArray()); } - result = ByteArray.toHexString(listBytes); + result = ByteArray.toJsonHex(listBytes); } else { logger.error("trigger contract failed."); } From a169e69795a60e81aeeff81703d39da865792918 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 23 Jun 2021 12:55:51 +0800 Subject: [PATCH 046/341] feat: add root and status to eth_getTransactionReceipt and modify the gasUsed --- .../tron/core/services/jsonrpc/TronJsonRpc.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index b6c1d31ec47..1912b1bd033 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -4,6 +4,8 @@ import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getToAddress; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTransactionAmount; + +import com.fasterxml.jackson.annotation.JsonInclude; import com.google.protobuf.ByteString; import com.googlecode.jsonrpc4j.JsonRpcError; import com.googlecode.jsonrpc4j.JsonRpcErrors; @@ -145,10 +147,10 @@ public TransactionLog() { public String contractAddress; public TransactionLog[] logs; public String logsBloom; - - public TransactionReceipt() { - - } + @JsonInclude(JsonInclude.Include.NON_NULL) + public String root; // 32 bytes of post-transaction stateroot (pre Byzantium) + @JsonInclude(JsonInclude.Include.NON_NULL) + public String status; // either 1 (success) or 0 (failure) (post Byzantium) public TransactionReceipt(Block block, TransactionInfo txInfo, Wallet wallet) { BlockCapsule blockCapsule = new BlockCapsule(block); @@ -169,6 +171,7 @@ public TransactionReceipt(Block block, TransactionInfo txInfo, Wallet wallet) { ResourceReceipt resourceReceipt = info.getReceipt(); long energyUsage = resourceReceipt.getEnergyUsage() + + resourceReceipt.getOriginEnergyUsage() + resourceReceipt.getEnergyFee() / sunPerEnergy; cumulativeGas += energyUsage; @@ -176,6 +179,7 @@ public TransactionReceipt(Block block, TransactionInfo txInfo, Wallet wallet) { transactionIndex = ByteArray.toJsonHex(index); cumulativeGasUsed = ByteArray.toJsonHex(cumulativeGas); gasUsed = ByteArray.toJsonHex(energyUsage); + status = resourceReceipt.getResultValue() == 1 ? "0x1" : "0x0"; transaction = block.getTransactions(index); break; @@ -223,6 +227,8 @@ public TransactionReceipt(Block block, TransactionInfo txInfo, Wallet wallet) { } logs = logList.toArray(new TransactionReceipt.TransactionLog[logList.size()]); logsBloom = null; // no value + + root = null; } } From 6c966a91366201df5ccae7de95fde1ee238a9305 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 23 Jun 2021 13:58:38 +0800 Subject: [PATCH 047/341] fix: fix log index in eth_getTransactionReceipt --- .../java/org/tron/core/services/jsonrpc/TronJsonRpc.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 1912b1bd033..2be295af931 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -158,6 +158,7 @@ public TransactionReceipt(Block block, TransactionInfo txInfo, Wallet wallet) { Transaction transaction = null; long cumulativeGas = 0; + long cumulativeLogCount = 0; long sunPerEnergy = Constant.SUN_PER_ENERGY; long dynamicEnergyFee = wallet.getEnergyFee(); @@ -183,6 +184,8 @@ public TransactionReceipt(Block block, TransactionInfo txInfo, Wallet wallet) { transaction = block.getTransactions(index); break; + } else { + cumulativeLogCount += info.getLogCount(); } } @@ -209,7 +212,8 @@ public TransactionReceipt(Block block, TransactionInfo txInfo, Wallet wallet) { TransactionInfo.Log log = txInfo.getLogList().get(index); TransactionReceipt.TransactionLog transactionLog = new TransactionReceipt.TransactionLog(); - transactionLog.logIndex = ByteArray.toJsonHex(index + 1); //log的索引从1开始 + // log的index为在这个block中的index + transactionLog.logIndex = ByteArray.toJsonHex(index + cumulativeLogCount); transactionLog.transactionHash = txid; transactionLog.transactionIndex = transactionIndex; transactionLog.blockHash = blockHash; From 2737fae163a1f77a6811af218a78d95709f19f10 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 23 Jun 2021 17:30:32 +0800 Subject: [PATCH 048/341] typo --- .../core/services/jsonrpc/TronJsonRpc.java | 9 ++- .../services/jsonrpc/TronJsonRpcImpl.java | 72 ++++++++++--------- 2 files changed, 44 insertions(+), 37 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 2be295af931..af33ef34fec 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -314,6 +314,9 @@ public String toString() { String web3ClientVersion(); @JsonRpcMethod("web3_sha3") + @JsonRpcErrors({ + @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{}"), + }) String web3Sha3(String data) throws Exception; @JsonRpcMethod("eth_getBlockTransactionCountByHash") @@ -373,9 +376,6 @@ public String toString() { }) String getABIofSmartContract(String contractAddress, String bnOrId); - @JsonRpcMethod("eth_syncing") - Object isSyncing(); - @JsonRpcMethod("eth_coinbase") @JsonRpcErrors({ @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{}"), @@ -439,6 +439,9 @@ public String toString() { @JsonRpcMethod("eth_getUncleCountByBlockNumber") String getUncleCountByBlockNumber(String blockNumOrTag); + @JsonRpcMethod("eth_getWork") + List ethGetWork(); + @JsonRpcMethod("eth_hashrate") String getHashRate(); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 25ca239215a..0c312bb7eed 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -79,7 +79,14 @@ public String web3ClientVersion() { @Override public String web3Sha3(String data) { - byte[] result = Hash.sha3(ByteArray.fromHexString(data)); + byte[] input; + try { + input = ByteArray.fromHexString(data); + } catch (Exception e) { + throw new JsonRpcApiException("invalid input value"); + } + + byte[] result = Hash.sha3(input); return ByteArray.toJsonHex(result); } @@ -133,9 +140,9 @@ private byte[] hashToByteArray(String hash) { } private byte[] addressHashToByteArray(String hash) { -// if (!Pattern.matches(regexAddressHash, hash)) { -// throw new JsonRpcApiException("invalid address hash value"); -// } + // if (!Pattern.matches(regexAddressHash, hash)) { + // throw new JsonRpcApiException("invalid address hash value"); + // } byte[] bHash; try { @@ -383,11 +390,6 @@ public String getABIofSmartContract(String contractAddress, String blockNumOrTag } } - @Override - public Object isSyncing() { - return true; - } - @Override public String getCoinbase() { //获取最新块的产块sr地址 @@ -470,21 +472,6 @@ private TransactionResult formatRpcTransaction(TransactionInfo transactioninfo, return new TransactionResult(block, transactionIndex, transaction, wallet); } - private TransactionResult formatRpcTransaction(Transaction transaction, Block block) { - String txid = ByteArray.toHexString( - new TransactionCapsule(transaction).getTransactionId().getBytes()); - - int transactionIndex = -1; - for (int index = 0; index < block.getTransactionsCount(); index++) { - if (getTxID(block.getTransactions(index)).equals(txid)) { - transactionIndex = index; - break; - } - } - - return new TransactionResult(block, transactionIndex, transaction, wallet); - } - public TransactionResult getTransactionByBlockAndIndex(Block block, String index) { int txIndex; try { @@ -634,21 +621,22 @@ public String getPeerCount() { @Override public Object getSyncingStatus() { //查询同步状态。未同步返回false,否则返回 SyncingResult - if (nodeInfoService.getNodeInfo().getPeerList().size() == 0) { + if (nodeInfoService.getNodeInfo().getPeerList().isEmpty()) { return false; } - long startingBlock = nodeInfoService.getNodeInfo().getBeginSyncNum(); + + long startingBlockNum = nodeInfoService.getNodeInfo().getBeginSyncNum(); Block nowBlock = wallet.getNowBlock(); - long currentBlock = nowBlock.getBlockHeader().getRawData().getNumber(); - long diff = (System.currentTimeMillis() - nowBlock.getBlockHeader().getRawData() - .getTimestamp()) / 3000; + long currentBlockNum = nowBlock.getBlockHeader().getRawData().getNumber(); + long diff = (System.currentTimeMillis() + - nowBlock.getBlockHeader().getRawData().getTimestamp()) / 3000; diff = diff > 0 ? diff : 0; - long highestBlock = currentBlock + diff; //预测的最高块号 - SyncingResult syncingResult = new SyncingResult(ByteArray.toJsonHex(startingBlock), - ByteArray.toJsonHex(currentBlock), - ByteArray.toJsonHex(highestBlock) + long highestBlockNum = currentBlockNum + diff; //预测的最高块号 + + return new SyncingResult(ByteArray.toJsonHex(startingBlockNum), + ByteArray.toJsonHex(currentBlockNum), + ByteArray.toJsonHex(highestBlockNum) ); - return syncingResult; } @Override @@ -675,6 +663,22 @@ public String getUncleCountByBlockNumber(String blockNumOrTag) { return "0x0"; } + @Override + public List ethGetWork() { + Block block = wallet.getNowBlock(); + String blockHash = null; + + if (block != null) { + blockHash = ByteArray.toJsonHex(new BlockCapsule(block).getBlockId().getBytes()); + } + + return Arrays.asList( + blockHash, + null, + null + ); + } + @Override public String getHashRate() { //读取当前挖矿节点的每秒钟哈希值算出数量,无用 From 694326b6018703e3c6057232a2f6b92145d5c165 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 23 Jun 2021 17:44:11 +0800 Subject: [PATCH 049/341] feat: add eth_chainId --- .../java/org/tron/core/services/jsonrpc/TronJsonRpc.java | 3 +++ .../org/tron/core/services/jsonrpc/TronJsonRpcImpl.java | 7 ++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index af33ef34fec..607cf06f4e9 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -346,6 +346,9 @@ public String toString() { @JsonRpcMethod("net_version") String getNetVersion(); + @JsonRpcMethod("eth_chainId") + String ethChainId(); + @JsonRpcMethod("net_listening") boolean isListening(); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 0c312bb7eed..4026e93e40b 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -212,7 +212,12 @@ private BlockResult getBlockResult(Block block, boolean fullTx) { @Override public String getNetVersion() { - //当前链的id,不能跟metamask已有的id冲突 + //network id,不能跟metamask已有的id冲突 + return ByteArray.toJsonHex(100); + } + + @Override + public String ethChainId() { return ByteArray.toJsonHex(100); } From b67b167895529bac371232876e157871da22dcef Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 24 Jun 2021 16:41:08 +0800 Subject: [PATCH 050/341] feat: add not supported method --- .../core/services/jsonrpc/TronJsonRpc.java | 88 +++++++++++++++++++ .../services/jsonrpc/TronJsonRpcImpl.java | 51 ++++++++++- 2 files changed, 138 insertions(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 607cf06f4e9..e02c8ad6ef4 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -310,6 +310,42 @@ public String toString() { } } + class CompilationResult { + public String code; + public CompilationInfo info; + + @Override + public String toString() { + return "CompilationResult{" + + "code='" + code + '\'' + + ", info=" + info + + '}'; + } + } + + class CompilationInfo { + public String source; + public String language; + public String languageVersion; + public String compilerVersion; + // public CallTransaction.Function[] abiDefinition; + public String userDoc; + public String developerDoc; + + @Override + public String toString() { + return "CompilationInfo{" + + "source='" + source + '\'' + + ", language='" + language + '\'' + + ", languageVersion='" + languageVersion + '\'' + + ", compilerVersion='" + compilerVersion + '\'' + // + ", abiDefinition=" + abiDefinition + '\'' + + ", userDoc='" + userDoc + '\'' + + ", developerDoc='" + developerDoc + '\'' + + '}'; + } + } + @JsonRpcMethod("web3_clientVersion") String web3ClientVersion(); @@ -392,8 +428,29 @@ public String toString() { String estimateGas(CallArguments args); @JsonRpcMethod("eth_getCompilers") + @JsonRpcErrors({ + @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), + }) String[] getCompilers(); + @JsonRpcMethod("eth_compileSolidity") + @JsonRpcErrors({ + @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), + }) + CompilationResult ethCompileSolidity(String contract) throws Exception; + + @JsonRpcMethod("eth_compileLLL") + @JsonRpcErrors({ + @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), + }) + CompilationResult ethCompileLLL(String contract); + + @JsonRpcMethod("eth_compileSerpent") + @JsonRpcErrors({ + @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), + }) + CompilationResult ethCompileSerpent(String contract); + @JsonRpcMethod("eth_getTransactionByHash") @JsonRpcErrors({ @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{}"), @@ -453,4 +510,35 @@ public String toString() { @JsonRpcMethod("eth_accounts") String[] getAccounts(); + + // not supported + @JsonRpcMethod("eth_submitWork") + @JsonRpcErrors({ + @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), + }) + boolean ethSubmitWork(String nonce, String header, String digest); + + @JsonRpcMethod("eth_sendRawTransaction") + @JsonRpcErrors({ + @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), + }) + String ethSendRawTransaction(String rawData); + + @JsonRpcMethod("eth_sendTransaction") + @JsonRpcErrors({ + @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), + }) + String ethSendTransaction(CallArguments transactionArgs); + + @JsonRpcMethod("eth_sign") + @JsonRpcErrors({ + @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), + }) + String ethSign(String addr, String data); + + @JsonRpcMethod("eth_signTransaction") + @JsonRpcErrors({ + @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), + }) + String ethSignTransaction(CallArguments transactionArgs); } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 4026e93e40b..476e33b849b 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -433,7 +433,26 @@ public String estimateGas(CallArguments args) { @Override public String[] getCompilers() { - return new String[] {"solidity"}; + throw new UnsupportedOperationException( + "the method eth_getCompilers does not exist/is not available"); + } + + @Override + public CompilationResult ethCompileSolidity(String contract) { + throw new UnsupportedOperationException( + "the method eth_compileSolidity does not exist/is not available"); + } + + @Override + public CompilationResult ethCompileLLL(String contract) { + throw new UnsupportedOperationException( + "the method eth_compileLLL does not exist/is not available"); + } + + @Override + public CompilationResult ethCompileSerpent(String contract) { + throw new UnsupportedOperationException( + "the method eth_compileSerpent does not exist/is not available"); } @Override @@ -701,6 +720,36 @@ public String[] getAccounts() { return new String[0]; } + @Override + public boolean ethSubmitWork(String nonceHex, String headerHex, String digestHex) { + throw new UnsupportedOperationException( + "the method eth_submitWork does not exist/is not available"); + } + + @Override + public String ethSendRawTransaction(String rawData) { + throw new UnsupportedOperationException( + "the method eth_sendRawTransaction does not exist/is not available"); + } + + @Override + public String ethSendTransaction(CallArguments args) { + throw new UnsupportedOperationException( + "the method eth_sendTransaction does not exist/is not available"); + } + + @Override + public String ethSign(String address, String msg) { + throw new UnsupportedOperationException( + "the method eth_sign does not exist/is not available"); + } + + @Override + public String ethSignTransaction(CallArguments transactionArgs) { + throw new UnsupportedOperationException( + "the method eth_signTransaction does not exist/is not available"); + } + public static void main(String[] args) { TronJsonRpcImpl impl = new TronJsonRpcImpl(); System.out.println(impl.generateCallParameter1()); From a2936360cc714096e896e1338ed8aa2d3e283ac4 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 24 Jun 2021 19:33:42 +0800 Subject: [PATCH 051/341] feat: add solidity --- .../JsonRpcOnSolidityService.java | 63 +++++++++++++++++++ .../JsonRpcOnSolidityServlet.java | 28 +++++++++ .../jsonrpc/FullNodeJsonRpcHttpService.java | 17 ----- .../main/java/org/tron/program/FullNode.java | 12 +++- 4 files changed, 100 insertions(+), 20 deletions(-) create mode 100644 framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcOnSolidityService.java create mode 100644 framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcOnSolidityServlet.java diff --git a/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcOnSolidityService.java b/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcOnSolidityService.java new file mode 100644 index 00000000000..cf8e34047f1 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcOnSolidityService.java @@ -0,0 +1,63 @@ +package org.tron.core.services.interfaceJsonRpcOnSolidity; + +import lombok.extern.slf4j.Slf4j; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.servlet.ServletHolder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.common.application.Service; +import org.tron.common.parameter.CommonParameter; + +@Component +@Slf4j(topic = "API") +public class JsonRpcOnSolidityService implements Service { + + private int port = 8094; + + private Server server; + + @Autowired + private JsonRpcOnSolidityServlet jsonRpcOnSolidityServlet; + + @Override + public void init() { + } + + @Override + public void init(CommonParameter args) { + } + + @Override + public void start() { + try { + server = new Server(port); + ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); + context.setContextPath("/"); + server.setHandler(context); + + context.addServlet(new ServletHolder(jsonRpcOnSolidityServlet), "/jsonrpc"); + + // filter + // ServletHandler handler = new ServletHandler(); + // FilterHolder fh = handler + // .addFilterWithMapping((Class) HttpInterceptor.class, "/*", + // EnumSet.of(DispatcherType.REQUEST)); + // context.addFilter(fh, "/*", EnumSet.of(DispatcherType.REQUEST)); + + server.start(); + + } catch (Exception e) { + logger.debug("IOException: {}", e.getMessage()); + } + } + + @Override + public void stop() { + try { + server.stop(); + } catch (Exception e) { + logger.debug("IOException: {}", e.getMessage()); + } + } +} diff --git a/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcOnSolidityServlet.java b/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcOnSolidityServlet.java new file mode 100644 index 00000000000..9f190b34c99 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcOnSolidityServlet.java @@ -0,0 +1,28 @@ +package org.tron.core.services.interfaceJsonRpcOnSolidity; + +import java.io.IOException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.core.services.interfaceOnSolidity.WalletOnSolidity; +import org.tron.core.services.jsonrpc.JsonRpcServlet; + +@Component +@Slf4j(topic = "API") +public class JsonRpcOnSolidityServlet extends JsonRpcServlet { + @Autowired + private WalletOnSolidity walletOnSolidity; + + protected void doPost(HttpServletRequest request, HttpServletResponse response) { + walletOnSolidity.futureGet(() -> { + try { + super.doPost(request, response); + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + }); + } +} \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java index 3f284b1d32d..1878db28d48 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java @@ -1,30 +1,13 @@ package org.tron.core.services.jsonrpc; -import com.googlecode.jsonrpc4j.JsonRpcServer; -import com.googlecode.jsonrpc4j.ProxyUtil; -import com.googlecode.jsonrpc4j.StreamServer; -import java.io.IOException; -import java.net.InetAddress; -import java.net.ServerSocket; -import java.util.EnumSet; -import javax.net.ServerSocketFactory; -import javax.servlet.DispatcherType; -import javax.servlet.Filter; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.ServletHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.tron.common.application.Service; import org.tron.common.parameter.CommonParameter; -import org.tron.core.config.args.Args; -import org.tron.core.services.filter.HttpInterceptor; @Component @Slf4j(topic = "API") diff --git a/framework/src/main/java/org/tron/program/FullNode.java b/framework/src/main/java/org/tron/program/FullNode.java index b09bf0b32e6..aad8b6c12bf 100644 --- a/framework/src/main/java/org/tron/program/FullNode.java +++ b/framework/src/main/java/org/tron/program/FullNode.java @@ -15,6 +15,7 @@ import org.tron.core.config.args.Args; import org.tron.core.services.RpcApiService; import org.tron.core.services.http.FullNodeHttpApiService; +import org.tron.core.services.interfaceJsonRpcOnSolidity.JsonRpcOnSolidityService; import org.tron.core.services.interfaceOnPBFT.RpcApiServiceOnPBFT; import org.tron.core.services.interfaceOnPBFT.http.PBFT.HttpApiOnPBFTService; import org.tron.core.services.interfaceOnSolidity.RpcApiServiceOnSolidity; @@ -84,13 +85,18 @@ public static void main(String[] args) { } // jsonrpc http server - // FullNodeJsonRpcStreamService jsonRpcStreamService = context.getBean(FullNodeJsonRpcStreamService.class); - FullNodeJsonRpcHttpService jsonRpcHttpService = context.getBean(FullNodeJsonRpcHttpService.class); if (CommonParameter.getInstance().fullNodeHttpJsonRpcEnable) { - // appT.addService(jsonRpcStreamService); + FullNodeJsonRpcHttpService jsonRpcHttpService = context.getBean(FullNodeJsonRpcHttpService.class); appT.addService(jsonRpcHttpService); } + // json rpc on solidity + if (Args.getInstance().getStorage().getDbVersion() == dbVersion) { + JsonRpcOnSolidityService jsonRpcOnSolidityService = context + .getBean(JsonRpcOnSolidityService.class); + appT.addService(jsonRpcOnSolidityService); + } + // full node and solidity node fuse together // provide solidity rpc and http server on the full node. if (Args.getInstance().getStorage().getDbVersion() == dbVersion) { From 89bd8a7761db2bef329c54c99815479a9621a4f7 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 24 Jun 2021 19:55:08 +0800 Subject: [PATCH 052/341] typo --- framework/src/main/java/org/tron/program/FullNode.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/program/FullNode.java b/framework/src/main/java/org/tron/program/FullNode.java index aad8b6c12bf..6713069f299 100644 --- a/framework/src/main/java/org/tron/program/FullNode.java +++ b/framework/src/main/java/org/tron/program/FullNode.java @@ -86,7 +86,8 @@ public static void main(String[] args) { // jsonrpc http server if (CommonParameter.getInstance().fullNodeHttpJsonRpcEnable) { - FullNodeJsonRpcHttpService jsonRpcHttpService = context.getBean(FullNodeJsonRpcHttpService.class); + FullNodeJsonRpcHttpService jsonRpcHttpService = + context.getBean(FullNodeJsonRpcHttpService.class); appT.addService(jsonRpcHttpService); } From 86dad8614ad3f4a0d2335e5e259409c1db94ec95 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 24 Jun 2021 19:56:30 +0800 Subject: [PATCH 053/341] typo --- framework/src/main/java/org/tron/program/FullNode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/program/FullNode.java b/framework/src/main/java/org/tron/program/FullNode.java index 6713069f299..96e4bbe8741 100644 --- a/framework/src/main/java/org/tron/program/FullNode.java +++ b/framework/src/main/java/org/tron/program/FullNode.java @@ -92,7 +92,7 @@ public static void main(String[] args) { } // json rpc on solidity - if (Args.getInstance().getStorage().getDbVersion() == dbVersion) { + if (CommonParameter.getInstance().getStorage().getDbVersion() == dbVersion) { JsonRpcOnSolidityService jsonRpcOnSolidityService = context .getBean(JsonRpcOnSolidityService.class); appT.addService(jsonRpcOnSolidityService); From db9af463355a28c59933697702c30690bf430543 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Fri, 25 Jun 2021 11:24:39 +0800 Subject: [PATCH 054/341] feat: add config for solidity json rpc --- .../tron/common/parameter/CommonParameter.java | 6 ++++++ .../src/main/java/org/tron/core/Constant.java | 2 ++ .../java/org/tron/core/config/args/Args.java | 11 +++++++++++ .../JsonRpcOnSolidityService.java | 2 +- .../JsonRpcOnSolidityServlet.java | 17 +++++++++-------- .../core/services/jsonrpc/JsonRpcApiUtil.java | 3 ++- .../tron/core/services/jsonrpc/TronJsonRpc.java | 5 ++--- .../core/services/jsonrpc/TronJsonRpcImpl.java | 7 ++----- .../main/java/org/tron/program/FullNode.java | 8 +++++--- 9 files changed, 40 insertions(+), 21 deletions(-) diff --git a/common/src/main/java/org/tron/common/parameter/CommonParameter.java b/common/src/main/java/org/tron/common/parameter/CommonParameter.java index ada58dbb24e..a360e474bae 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -174,6 +174,9 @@ public class CommonParameter { public int jsonRpcHttpPort; @Getter @Setter + public int solidityJsonRpcHttpPort; + @Getter + @Setter public String energyCost; @Getter @Setter @@ -401,6 +404,9 @@ public class CommonParameter { public boolean fullNodeHttpJsonRpcEnable = true; @Getter @Setter + public boolean solidityNodeHttpJsonRpcEnable = true; + @Getter + @Setter public int maxTransactionPendingSize; @Getter @Setter diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index 0234af403da..c8cf7b5150f 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -96,6 +96,8 @@ public class Constant { public static final String NODE_HTTP_PBFT_PORT = "node.http.PBFTPort"; public static final String NODE_HTTP_JSONRPC_PORT = "node.http.jsonRpcPort"; public static final String NODE_HTTP_JSONRPC_ENABLE = "node.http.jsonRpcEnable"; + public static final String NODE_HTTP_JSONRPC_SOLIDITY_PORT = "node.http.jsonRpcSolidityPort"; + public static final String NODE_HTTP_JSONRPC_SOLIDITY_ENABLE = "node.http.jsonRpcSolidityEnable"; public static final String NODE_ENERGY_COST = "node.http.energyCost"; public static final String NODE_RPC_THREAD = "node.rpc.thread"; diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index fcaad2afc9c..49c3e0612eb 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -134,6 +134,7 @@ public static void clearParam() { PARAMETER.solidityHttpPort = 0; PARAMETER.pBFTHttpPort = 0; PARAMETER.jsonRpcHttpPort = 0; + PARAMETER.solidityJsonRpcHttpPort = 0; PARAMETER.energyCost = ""; PARAMETER.maintenanceTimeInterval = 0; PARAMETER.proposalExpireTime = 0; @@ -177,6 +178,7 @@ public static void clearParam() { PARAMETER.fullNodeHttpEnable = true; PARAMETER.solidityNodeHttpEnable = true; PARAMETER.fullNodeHttpJsonRpcEnable = true; + PARAMETER.solidityNodeHttpJsonRpcEnable = true; PARAMETER.nodeMetricsEnable = false; PARAMETER.metricsStorageEnable = false; PARAMETER.agreeNodeCount = MAX_ACTIVE_WITNESS_NUM * 2 / 3 + 1; @@ -297,6 +299,11 @@ public static void setParam(final String[] args, final String confFileName) { PARAMETER.fullNodeHttpJsonRpcEnable = config.getBoolean(Constant.NODE_HTTP_JSONRPC_ENABLE); } + if (config.hasPath(Constant.NODE_HTTP_JSONRPC_SOLIDITY_ENABLE)) { + PARAMETER.solidityNodeHttpJsonRpcEnable = + config.getBoolean(Constant.NODE_HTTP_JSONRPC_SOLIDITY_ENABLE); + } + if (config.hasPath(Constant.VM_MIN_TIME_RATIO)) { PARAMETER.minTimeRatio = config.getDouble(Constant.VM_MIN_TIME_RATIO); } @@ -462,6 +469,10 @@ public static void setParam(final String[] args, final String confFileName) { config.hasPath(Constant.NODE_HTTP_JSONRPC_PORT) ? config.getInt(Constant.NODE_HTTP_JSONRPC_PORT) : 8093; + PARAMETER.solidityJsonRpcHttpPort = + config.hasPath(Constant.NODE_HTTP_JSONRPC_SOLIDITY_PORT) + ? config.getInt(Constant.NODE_HTTP_JSONRPC_SOLIDITY_PORT) : 8094; + PARAMETER.energyCost = config.hasPath(Constant.NODE_ENERGY_COST) ? config.getString(Constant.NODE_ENERGY_COST) : "27553334:140,25304425:40,0:10"; diff --git a/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcOnSolidityService.java b/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcOnSolidityService.java index cf8e34047f1..70fbdadad6c 100644 --- a/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcOnSolidityService.java +++ b/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcOnSolidityService.java @@ -13,7 +13,7 @@ @Slf4j(topic = "API") public class JsonRpcOnSolidityService implements Service { - private int port = 8094; + private int port = CommonParameter.getInstance().getSolidityJsonRpcHttpPort(); private Server server; diff --git a/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcOnSolidityServlet.java b/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcOnSolidityServlet.java index 9f190b34c99..a20c7906ad0 100644 --- a/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcOnSolidityServlet.java +++ b/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcOnSolidityServlet.java @@ -12,17 +12,18 @@ @Component @Slf4j(topic = "API") public class JsonRpcOnSolidityServlet extends JsonRpcServlet { + @Autowired private WalletOnSolidity walletOnSolidity; protected void doPost(HttpServletRequest request, HttpServletResponse response) { - walletOnSolidity.futureGet(() -> { - try { - super.doPost(request, response); - } catch (IOException e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - }); + walletOnSolidity.futureGet(() -> { + try { + super.doPost(request, response); + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + }); } } \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index bff18d0cb98..efc38f02e0b 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -337,7 +337,8 @@ public static long getTransactionAmount(Transaction.Contract contract, String ha // long token = DataImporter.getTokenID(blockNum, // contractParameter.unpack(ParticipateAssetIssueContract.class).getAssetName()); // //获取token的比例,计算出10币的数量 - // long trxNum = contractParameter.unpack(ParticipateAssetIssueContract.class).getAmount(); + // long trxNum = contractParameter.unpack(ParticipateAssetIssueContract.class) + // .getAmount(); // Token10Entity entity = DataImporter.getTokenEntity(token); // long exchangeAmount = Math.multiplyExact(trxNum, entity.getNum()); // exchangeAmount = Math.floorDiv(exchangeAmount, entity.getTrxNum()); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index e02c8ad6ef4..3ead5f5a61e 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -4,7 +4,6 @@ import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getToAddress; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTransactionAmount; - import com.fasterxml.jackson.annotation.JsonInclude; import com.google.protobuf.ByteString; import com.googlecode.jsonrpc4j.JsonRpcError; @@ -334,8 +333,8 @@ class CompilationInfo { @Override public String toString() { - return "CompilationInfo{" + - "source='" + source + '\'' + return "CompilationInfo{" + + "source='" + source + '\'' + ", language='" + language + '\'' + ", languageVersion='" + languageVersion + '\'' + ", compilerVersion='" + compilerVersion + '\'' diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 476e33b849b..92b19dd4f7a 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -140,10 +140,6 @@ private byte[] hashToByteArray(String hash) { } private byte[] addressHashToByteArray(String hash) { - // if (!Pattern.matches(regexAddressHash, hash)) { - // throw new JsonRpcApiException("invalid address hash value"); - // } - byte[] bHash; try { bHash = ByteArray.fromHexString(hash); @@ -151,7 +147,8 @@ private byte[] addressHashToByteArray(String hash) { && bHash.length != DecodeUtil.ADDRESS_SIZE / 2 - 1) { throw new JsonRpcApiException("invalid address hash value"); } - if (bHash.length == DecodeUtil.ADDRESS_SIZE/2 - 1) { + + if (bHash.length == DecodeUtil.ADDRESS_SIZE / 2 - 1) { bHash = ByteUtil.merge(new byte[] {DecodeUtil.addressPreFixByte}, bHash); } } catch (Exception e) { diff --git a/framework/src/main/java/org/tron/program/FullNode.java b/framework/src/main/java/org/tron/program/FullNode.java index 96e4bbe8741..c26a20ee04d 100644 --- a/framework/src/main/java/org/tron/program/FullNode.java +++ b/framework/src/main/java/org/tron/program/FullNode.java @@ -93,9 +93,11 @@ public static void main(String[] args) { // json rpc on solidity if (CommonParameter.getInstance().getStorage().getDbVersion() == dbVersion) { - JsonRpcOnSolidityService jsonRpcOnSolidityService = context - .getBean(JsonRpcOnSolidityService.class); - appT.addService(jsonRpcOnSolidityService); + if (CommonParameter.getInstance().solidityNodeHttpJsonRpcEnable) { + JsonRpcOnSolidityService jsonRpcOnSolidityService = context + .getBean(JsonRpcOnSolidityService.class); + appT.addService(jsonRpcOnSolidityService); + } } // full node and solidity node fuse together From fe88dee902fc42811a6bd27ac5e0a0a0b92f77a2 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Fri, 25 Jun 2021 15:51:21 +0800 Subject: [PATCH 055/341] typo --- ...ice.java => JsonRpcServiceOnSolidity.java} | 2 +- .../main/java/org/tron/program/FullNode.java | 22 +++++++++---------- 2 files changed, 11 insertions(+), 13 deletions(-) rename framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/{JsonRpcOnSolidityService.java => JsonRpcServiceOnSolidity.java} (96%) diff --git a/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcOnSolidityService.java b/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcServiceOnSolidity.java similarity index 96% rename from framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcOnSolidityService.java rename to framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcServiceOnSolidity.java index 70fbdadad6c..d6a4061cab9 100644 --- a/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcOnSolidityService.java +++ b/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcServiceOnSolidity.java @@ -11,7 +11,7 @@ @Component @Slf4j(topic = "API") -public class JsonRpcOnSolidityService implements Service { +public class JsonRpcServiceOnSolidity implements Service { private int port = CommonParameter.getInstance().getSolidityJsonRpcHttpPort(); diff --git a/framework/src/main/java/org/tron/program/FullNode.java b/framework/src/main/java/org/tron/program/FullNode.java index c26a20ee04d..3cf102409bb 100644 --- a/framework/src/main/java/org/tron/program/FullNode.java +++ b/framework/src/main/java/org/tron/program/FullNode.java @@ -15,7 +15,7 @@ import org.tron.core.config.args.Args; import org.tron.core.services.RpcApiService; import org.tron.core.services.http.FullNodeHttpApiService; -import org.tron.core.services.interfaceJsonRpcOnSolidity.JsonRpcOnSolidityService; +import org.tron.core.services.interfaceJsonRpcOnSolidity.JsonRpcServiceOnSolidity; import org.tron.core.services.interfaceOnPBFT.RpcApiServiceOnPBFT; import org.tron.core.services.interfaceOnPBFT.http.PBFT.HttpApiOnPBFTService; import org.tron.core.services.interfaceOnSolidity.RpcApiServiceOnSolidity; @@ -84,25 +84,16 @@ public static void main(String[] args) { appT.addService(httpApiService); } - // jsonrpc http server + // JSON-RPC http server if (CommonParameter.getInstance().fullNodeHttpJsonRpcEnable) { FullNodeJsonRpcHttpService jsonRpcHttpService = context.getBean(FullNodeJsonRpcHttpService.class); appT.addService(jsonRpcHttpService); } - // json rpc on solidity - if (CommonParameter.getInstance().getStorage().getDbVersion() == dbVersion) { - if (CommonParameter.getInstance().solidityNodeHttpJsonRpcEnable) { - JsonRpcOnSolidityService jsonRpcOnSolidityService = context - .getBean(JsonRpcOnSolidityService.class); - appT.addService(jsonRpcOnSolidityService); - } - } - // full node and solidity node fuse together // provide solidity rpc and http server on the full node. - if (Args.getInstance().getStorage().getDbVersion() == dbVersion) { + if (CommonParameter.getInstance().getStorage().getDbVersion() == dbVersion) { RpcApiServiceOnSolidity rpcApiServiceOnSolidity = context .getBean(RpcApiServiceOnSolidity.class); appT.addService(rpcApiServiceOnSolidity); @@ -111,6 +102,13 @@ public static void main(String[] args) { if (CommonParameter.getInstance().solidityNodeHttpEnable) { appT.addService(httpApiOnSolidityService); } + + // JSON-RPC on solidity + if (CommonParameter.getInstance().solidityNodeHttpJsonRpcEnable) { + JsonRpcServiceOnSolidity jsonRpcServiceOnSolidity = context + .getBean(JsonRpcServiceOnSolidity.class); + appT.addService(jsonRpcServiceOnSolidity); + } } // PBFT API (HTTP and GRPC) From 5ac8f6d742437caa4421d7a481f87e2a63c735c5 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Fri, 25 Jun 2021 16:05:11 +0800 Subject: [PATCH 056/341] feat: add parity_nextNonce --- .../java/org/tron/core/services/jsonrpc/TronJsonRpc.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 3ead5f5a61e..8a433d94dd2 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -540,4 +540,10 @@ public String toString() { @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), }) String ethSignTransaction(CallArguments transactionArgs); + + @JsonRpcMethod("parity_nextNonce") + @JsonRpcErrors({ + @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), + }) + String parityNextNonce(String address); } From a3da80d325a3858d5e6f0410c9f51d38dddb231d Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Fri, 25 Jun 2021 16:06:51 +0800 Subject: [PATCH 057/341] feat: add parity_nextNonce --- .../org/tron/core/services/jsonrpc/TronJsonRpcImpl.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 92b19dd4f7a..6b7b67bec0b 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -747,6 +747,12 @@ public String ethSignTransaction(CallArguments transactionArgs) { "the method eth_signTransaction does not exist/is not available"); } + @Override + public String parityNextNonce(String address) { + throw new UnsupportedOperationException( + "the method parity_nextNonce does not exist/is not available"); + } + public static void main(String[] args) { TronJsonRpcImpl impl = new TronJsonRpcImpl(); System.out.println(impl.generateCallParameter1()); From 6465645dcb74f338d6fa2e87b0193e52b37c0a31 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Fri, 25 Jun 2021 16:24:10 +0800 Subject: [PATCH 058/341] refactor: move test code to test file --- .../services/jsonrpc/TronJsonRpcImpl.java | 71 ---------------- .../org/tron/core/jsonrpc/JsonRpcTest.java | 82 +++++++++++++++++++ 2 files changed, 82 insertions(+), 71 deletions(-) create mode 100644 framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 6b7b67bec0b..07d61bce23f 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -569,70 +569,6 @@ public String getCall(CallArguments transactionCall, String blockNumOrTag) { } } - //生成一个调用 eth_call api的参数,可以自由修改 - private String generateCallParameter1() { - String ownerAddress = "TXvRyjomvtNWSKvNouTvAedRGD4w9RXLZD"; - String usdjAddress = "TLBaRhANQoJFTqre9Nf1mjuwNWjCJeYqUL"; // nile测试环境udsj地址 - - byte[] addressData = Commons.decodeFromBase58Check(ownerAddress); - byte[] addressDataWord = new byte[32]; - System.arraycopy(Commons.decodeFromBase58Check(ownerAddress), 0, addressDataWord, - 32 - addressData.length, addressData.length); - String data = getMethodSign("balanceOf(address)") + Hex.toHexString(addressDataWord); - - CallArguments transactionCall = new CallArguments(); - transactionCall.from = ByteArray.toHexString(Commons.decodeFromBase58Check(ownerAddress)); - transactionCall.to = ByteArray.toHexString(Commons.decodeFromBase58Check(usdjAddress)); - transactionCall.data = data; - - StringBuffer sb = new StringBuffer("{\"jsonrpc\":\"2.0\",\"method\":\"eth_call\",\"params\":["); - sb.append(transactionCall); - sb.append(", \"latest\"],\"id\":1}"); - return sb.toString(); - } - - //生成一个调用 eth_call api的参数,可以自由修改 - private String generateCallParameter2() { - String ownerAddress = "TRXPT6Ny7EFvTPv7mFUqaFUST39WUZ4zzz"; - String usdjAddress = "TXYZopYRdj2D9XRtbG411XZZ3kM5VkAeBf"; // nile测试环境udsj地址 - - byte[] addressData = Commons.decodeFromBase58Check(ownerAddress); - byte[] addressDataWord = new byte[32]; - System.arraycopy(Commons.decodeFromBase58Check(ownerAddress), 0, addressDataWord, - 32 - addressData.length, addressData.length); - String data = getMethodSign("name()"); - - CallArguments transactionCall = new CallArguments(); - transactionCall.from = ByteArray.toHexString(Commons.decodeFromBase58Check(ownerAddress)); - transactionCall.to = ByteArray.toHexString(Commons.decodeFromBase58Check(usdjAddress)); - transactionCall.data = data; - - StringBuffer sb = new StringBuffer("{\"jsonrpc\":\"2.0\",\"method\":\"eth_call\",\"params\":["); - sb.append(transactionCall); - sb.append(", \"latest\"],\"id\":1}"); - return sb.toString(); - } - - private String generateStorageParameter() { - // nile合约:TXEphLzyv5jFwvjzwMok9UoehaSn294ZhN - String contractAddress = "41E94EAD5F4CA072A25B2E5500934709F1AEE3C64B"; - - // nile测试环境:TXvRyjomvtNWSKvNouTvAedRGD4w9RXLZD - String sendAddress = "41F0CC5A2A84CD0F68ED1667070934542D673ACBD8"; - String index = "01"; - byte[] byte1 = new DataWord(new DataWord(sendAddress).getLast20Bytes()).getData(); - byte[] byte2 = new DataWord(new DataWord(index).getLast20Bytes()).getData(); - byte[] byte3 = ByteUtil.merge(byte1, byte2); - String position = ByteArray.toJsonHex(Hash.sha3(byte3)); - - StringBuffer sb = new StringBuffer( - "{\"jsonrpc\":\"2.0\",\"method\":\"eth_getStorageAt\",\"params\":[\"0x"); - sb.append(contractAddress + "\",\""); - sb.append(position + "\","); - sb.append("\"latest\"],\"id\":1}"); - return sb.toString(); - } - @Override public String getPeerCount() { //返回当前节点所连接的peer节点数量 @@ -752,11 +688,4 @@ public String parityNextNonce(String address) { throw new UnsupportedOperationException( "the method parity_nextNonce does not exist/is not available"); } - - public static void main(String[] args) { - TronJsonRpcImpl impl = new TronJsonRpcImpl(); - System.out.println(impl.generateCallParameter1()); - System.out.println(impl.generateCallParameter2()); - System.out.println(impl.generateStorageParameter()); - } } diff --git a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java new file mode 100644 index 00000000000..5b7702e1e9b --- /dev/null +++ b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java @@ -0,0 +1,82 @@ +package org.tron.core.jsonrpc; + +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getMethodSign; + +import org.junit.Test; +import org.spongycastle.util.encoders.Hex; +import org.tron.common.crypto.Hash; +import org.tron.common.runtime.vm.DataWord; +import org.tron.common.utils.ByteArray; +import org.tron.common.utils.ByteUtil; +import org.tron.common.utils.Commons; +import org.tron.core.services.jsonrpc.TronJsonRpc.CallArguments; + +public class JsonRpcTest { + + @Test + public void generateCallParameter1() { + String ownerAddress = "TXvRyjomvtNWSKvNouTvAedRGD4w9RXLZD"; + String usdjAddress = "TLBaRhANQoJFTqre9Nf1mjuwNWjCJeYqUL"; // nile测试环境udsj地址 + + byte[] addressData = Commons.decodeFromBase58Check(ownerAddress); + byte[] addressDataWord = new byte[32]; + System.arraycopy(Commons.decodeFromBase58Check(ownerAddress), 0, addressDataWord, + 32 - addressData.length, addressData.length); + String data = getMethodSign("balanceOf(address)") + Hex.toHexString(addressDataWord); + + CallArguments transactionCall = new CallArguments(); + transactionCall.from = ByteArray.toHexString(Commons.decodeFromBase58Check(ownerAddress)); + transactionCall.to = ByteArray.toHexString(Commons.decodeFromBase58Check(usdjAddress)); + transactionCall.data = data; + + StringBuffer sb = new StringBuffer("{\"jsonrpc\":\"2.0\",\"method\":\"eth_call\",\"params\":["); + sb.append(transactionCall); + sb.append(", \"latest\"],\"id\":1}"); + + System.out.println(sb.toString()); + } + + @Test + public void generateCallParameter2() { + String ownerAddress = "TRXPT6Ny7EFvTPv7mFUqaFUST39WUZ4zzz"; + String usdjAddress = "TXYZopYRdj2D9XRtbG411XZZ3kM5VkAeBf"; // nile测试环境udsj地址 + + byte[] addressData = Commons.decodeFromBase58Check(ownerAddress); + byte[] addressDataWord = new byte[32]; + System.arraycopy(Commons.decodeFromBase58Check(ownerAddress), 0, addressDataWord, + 32 - addressData.length, addressData.length); + String data = getMethodSign("name()"); + + CallArguments transactionCall = new CallArguments(); + transactionCall.from = ByteArray.toHexString(Commons.decodeFromBase58Check(ownerAddress)); + transactionCall.to = ByteArray.toHexString(Commons.decodeFromBase58Check(usdjAddress)); + transactionCall.data = data; + + StringBuffer sb = new StringBuffer("{\"jsonrpc\":\"2.0\",\"method\":\"eth_call\",\"params\":["); + sb.append(transactionCall); + sb.append(", \"latest\"],\"id\":1}"); + + System.out.println(sb.toString()); + } + + private String generateStorageParameter() { + // nile contract:TXEphLzyv5jFwvjzwMok9UoehaSn294ZhN + String contractAddress = "41E94EAD5F4CA072A25B2E5500934709F1AEE3C64B"; + + // nile:TXvRyjomvtNWSKvNouTvAedRGD4w9RXLZD + String sendAddress = "41F0CC5A2A84CD0F68ED1667070934542D673ACBD8"; + String index = "01"; + byte[] byte1 = new DataWord(new DataWord(sendAddress).getLast20Bytes()).getData(); + byte[] byte2 = new DataWord(new DataWord(index).getLast20Bytes()).getData(); + byte[] byte3 = ByteUtil.merge(byte1, byte2); + String position = ByteArray.toJsonHex(Hash.sha3(byte3)); + + StringBuffer sb = new StringBuffer( + "{\"jsonrpc\":\"2.0\",\"method\":\"eth_getStorageAt\",\"params\":[\"0x"); + sb.append(contractAddress + "\",\""); + sb.append(position + "\","); + sb.append("\"latest\"],\"id\":1}"); + return sb.toString(); + } + +} From 23c7cb7781c40269f31bf0e3027c69d4d445c18b Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Fri, 25 Jun 2021 17:22:22 +0800 Subject: [PATCH 059/341] feat: add json-rpc on pbft, disabled by default --- .../common/parameter/CommonParameter.java | 7 ++- .../src/main/java/org/tron/core/Constant.java | 2 + .../java/org/tron/core/config/args/Args.java | 11 ++++ .../JsonRpcOnPBFTServlet.java | 29 +++++++++ .../JsonRpcServiceOnPBFT.java | 63 +++++++++++++++++++ .../main/java/org/tron/program/FullNode.java | 7 +++ .../org/tron/core/jsonrpc/JsonRpcTest.java | 4 +- 7 files changed, 120 insertions(+), 3 deletions(-) create mode 100644 framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnPBFT/JsonRpcOnPBFTServlet.java create mode 100644 framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnPBFT/JsonRpcServiceOnPBFT.java diff --git a/common/src/main/java/org/tron/common/parameter/CommonParameter.java b/common/src/main/java/org/tron/common/parameter/CommonParameter.java index a360e474bae..0fdf72997ed 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -3,7 +3,6 @@ import com.beust.jcommander.Parameter; import java.util.ArrayList; import java.util.List; -import java.util.Map; import java.util.Set; import lombok.Getter; import lombok.Setter; @@ -177,6 +176,9 @@ public class CommonParameter { public int solidityJsonRpcHttpPort; @Getter @Setter + public int pBFTJsonRpcHttpPort; + @Getter + @Setter public String energyCost; @Getter @Setter @@ -407,6 +409,9 @@ public class CommonParameter { public boolean solidityNodeHttpJsonRpcEnable = true; @Getter @Setter + public boolean pBFTNodeHttpJsonRpcEnable = false; + @Getter + @Setter public int maxTransactionPendingSize; @Getter @Setter diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index c8cf7b5150f..4f94c989184 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -98,6 +98,8 @@ public class Constant { public static final String NODE_HTTP_JSONRPC_ENABLE = "node.http.jsonRpcEnable"; public static final String NODE_HTTP_JSONRPC_SOLIDITY_PORT = "node.http.jsonRpcSolidityPort"; public static final String NODE_HTTP_JSONRPC_SOLIDITY_ENABLE = "node.http.jsonRpcSolidityEnable"; + public static final String NODE_HTTP_JSONRPC_PBFT_PORT = "node.http.jsonRpcPBFTPort"; + public static final String NODE_HTTP_JSONRPC_PBFT_ENABLE = "node.http.jsonRpcPBFTEnable"; public static final String NODE_ENERGY_COST = "node.http.energyCost"; public static final String NODE_RPC_THREAD = "node.rpc.thread"; diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index 49c3e0612eb..a1c01eaa7d8 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -135,6 +135,7 @@ public static void clearParam() { PARAMETER.pBFTHttpPort = 0; PARAMETER.jsonRpcHttpPort = 0; PARAMETER.solidityJsonRpcHttpPort = 0; + PARAMETER.pBFTJsonRpcHttpPort = 0; PARAMETER.energyCost = ""; PARAMETER.maintenanceTimeInterval = 0; PARAMETER.proposalExpireTime = 0; @@ -179,6 +180,7 @@ public static void clearParam() { PARAMETER.solidityNodeHttpEnable = true; PARAMETER.fullNodeHttpJsonRpcEnable = true; PARAMETER.solidityNodeHttpJsonRpcEnable = true; + PARAMETER.pBFTNodeHttpJsonRpcEnable = false; PARAMETER.nodeMetricsEnable = false; PARAMETER.metricsStorageEnable = false; PARAMETER.agreeNodeCount = MAX_ACTIVE_WITNESS_NUM * 2 / 3 + 1; @@ -304,6 +306,11 @@ public static void setParam(final String[] args, final String confFileName) { config.getBoolean(Constant.NODE_HTTP_JSONRPC_SOLIDITY_ENABLE); } + if (config.hasPath(Constant.NODE_HTTP_JSONRPC_PBFT_ENABLE)) { + PARAMETER.pBFTNodeHttpJsonRpcEnable = + config.getBoolean(Constant.NODE_HTTP_JSONRPC_PBFT_ENABLE); + } + if (config.hasPath(Constant.VM_MIN_TIME_RATIO)) { PARAMETER.minTimeRatio = config.getDouble(Constant.VM_MIN_TIME_RATIO); } @@ -473,6 +480,10 @@ public static void setParam(final String[] args, final String confFileName) { config.hasPath(Constant.NODE_HTTP_JSONRPC_SOLIDITY_PORT) ? config.getInt(Constant.NODE_HTTP_JSONRPC_SOLIDITY_PORT) : 8094; + PARAMETER.pBFTJsonRpcHttpPort = + config.hasPath(Constant.NODE_HTTP_JSONRPC_PBFT_PORT) + ? config.getInt(Constant.NODE_HTTP_JSONRPC_PBFT_PORT) : 8095; + PARAMETER.energyCost = config.hasPath(Constant.NODE_ENERGY_COST) ? config.getString(Constant.NODE_ENERGY_COST) : "27553334:140,25304425:40,0:10"; diff --git a/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnPBFT/JsonRpcOnPBFTServlet.java b/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnPBFT/JsonRpcOnPBFTServlet.java new file mode 100644 index 00000000000..bcc383e55db --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnPBFT/JsonRpcOnPBFTServlet.java @@ -0,0 +1,29 @@ +package org.tron.core.services.interfaceJsonRpcOnPBFT; + +import java.io.IOException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.core.services.interfaceOnPBFT.WalletOnPBFT; +import org.tron.core.services.jsonrpc.JsonRpcServlet; + +@Component +@Slf4j(topic = "API") +public class JsonRpcOnPBFTServlet extends JsonRpcServlet { + + @Autowired + private WalletOnPBFT walletOnPBFT; + + protected void doPost(HttpServletRequest request, HttpServletResponse response) { + walletOnPBFT.futureGet(() -> { + try { + super.doPost(request, response); + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + }); + } +} \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnPBFT/JsonRpcServiceOnPBFT.java b/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnPBFT/JsonRpcServiceOnPBFT.java new file mode 100644 index 00000000000..0b44791a466 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnPBFT/JsonRpcServiceOnPBFT.java @@ -0,0 +1,63 @@ +package org.tron.core.services.interfaceJsonRpcOnPBFT; + +import lombok.extern.slf4j.Slf4j; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.servlet.ServletHolder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.common.application.Service; +import org.tron.common.parameter.CommonParameter; + +@Component +@Slf4j(topic = "API") +public class JsonRpcServiceOnPBFT implements Service { + + private int port = CommonParameter.getInstance().getPBFTJsonRpcHttpPort(); + + private Server server; + + @Autowired + private JsonRpcOnPBFTServlet jsonRpcOnPBFTServlet; + + @Override + public void init() { + } + + @Override + public void init(CommonParameter args) { + } + + @Override + public void start() { + try { + server = new Server(port); + ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); + context.setContextPath("/"); + server.setHandler(context); + + context.addServlet(new ServletHolder(jsonRpcOnPBFTServlet), "/jsonrpc"); + + // filter + // ServletHandler handler = new ServletHandler(); + // FilterHolder fh = handler + // .addFilterWithMapping((Class) HttpInterceptor.class, "/*", + // EnumSet.of(DispatcherType.REQUEST)); + // context.addFilter(fh, "/*", EnumSet.of(DispatcherType.REQUEST)); + + server.start(); + + } catch (Exception e) { + logger.debug("IOException: {}", e.getMessage()); + } + } + + @Override + public void stop() { + try { + server.stop(); + } catch (Exception e) { + logger.debug("IOException: {}", e.getMessage()); + } + } +} diff --git a/framework/src/main/java/org/tron/program/FullNode.java b/framework/src/main/java/org/tron/program/FullNode.java index 3cf102409bb..ef3ba52ce41 100644 --- a/framework/src/main/java/org/tron/program/FullNode.java +++ b/framework/src/main/java/org/tron/program/FullNode.java @@ -15,6 +15,7 @@ import org.tron.core.config.args.Args; import org.tron.core.services.RpcApiService; import org.tron.core.services.http.FullNodeHttpApiService; +import org.tron.core.services.interfaceJsonRpcOnPBFT.JsonRpcServiceOnPBFT; import org.tron.core.services.interfaceJsonRpcOnSolidity.JsonRpcServiceOnSolidity; import org.tron.core.services.interfaceOnPBFT.RpcApiServiceOnPBFT; import org.tron.core.services.interfaceOnPBFT.http.PBFT.HttpApiOnPBFTService; @@ -119,6 +120,12 @@ public static void main(String[] args) { HttpApiOnPBFTService httpApiOnPBFTService = context .getBean(HttpApiOnPBFTService.class); appT.addService(httpApiOnPBFTService); + + // JSON-RPC on PBFT + if (CommonParameter.getInstance().pBFTNodeHttpJsonRpcEnable) { + JsonRpcServiceOnPBFT jsonRpcServiceOnPBFT = context.getBean(JsonRpcServiceOnPBFT.class); + appT.addService(jsonRpcServiceOnPBFT); + } } appT.initServices(parameter); diff --git a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java index 5b7702e1e9b..dd64c2845c3 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java @@ -16,7 +16,7 @@ public class JsonRpcTest { @Test public void generateCallParameter1() { String ownerAddress = "TXvRyjomvtNWSKvNouTvAedRGD4w9RXLZD"; - String usdjAddress = "TLBaRhANQoJFTqre9Nf1mjuwNWjCJeYqUL"; // nile测试环境udsj地址 + String usdjAddress = "TLBaRhANQoJFTqre9Nf1mjuwNWjCJeYqUL"; // nile udsj address byte[] addressData = Commons.decodeFromBase58Check(ownerAddress); byte[] addressDataWord = new byte[32]; @@ -39,7 +39,7 @@ public void generateCallParameter1() { @Test public void generateCallParameter2() { String ownerAddress = "TRXPT6Ny7EFvTPv7mFUqaFUST39WUZ4zzz"; - String usdjAddress = "TXYZopYRdj2D9XRtbG411XZZ3kM5VkAeBf"; // nile测试环境udsj地址 + String usdjAddress = "TXYZopYRdj2D9XRtbG411XZZ3kM5VkAeBf"; // nile udsj address byte[] addressData = Commons.decodeFromBase58Check(ownerAddress); byte[] addressDataWord = new byte[32]; From 3a7c17714178e7e12c3cf49df860a78bb6a10a9e Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Mon, 28 Jun 2021 17:51:31 +0800 Subject: [PATCH 060/341] feat: ignore address prefix 41 for eth_getTransactionReceipt --- .../main/java/org/tron/common/utils/ByteArray.java | 14 ++++++++++++++ .../tron/core/services/jsonrpc/TronJsonRpc.java | 8 ++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/common/src/main/java/org/tron/common/utils/ByteArray.java b/common/src/main/java/org/tron/common/utils/ByteArray.java index 87781487f41..5327aafd4c8 100644 --- a/common/src/main/java/org/tron/common/utils/ByteArray.java +++ b/common/src/main/java/org/tron/common/utils/ByteArray.java @@ -116,6 +116,20 @@ public static String toJsonHex(byte[] x) { return x == null || x.length == 0 ? null : "0x" + Hex.toHexString(x); } + // ignore the 41 + public static String toJsonHexAddress(byte[] x) { + if (x == null || x.length == 0) { + return null; + } else { + String res = Hex.toHexString(x); + if (res.startsWith(DecodeUtil.addressPreFixString)) { + return "0x" + res.substring(DecodeUtil.addressPreFixString.length()); + } else { + return "0x" + res; + } + } + } + public static String toJsonHex(Long x) { return x == null ? null : "0x" + Long.toHexString(x); } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 8a433d94dd2..d5dda3e3e31 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -196,14 +196,14 @@ public TransactionReceipt(Block block, TransactionInfo txInfo, Wallet wallet) { Contract contract = transaction.getRawData().getContract(0); byte[] fromByte = TransactionCapsule.getOwner(contract); byte[] toByte = getToAddress(transaction); - from = ByteArray.toJsonHex(fromByte); - to = ByteArray.toJsonHex(toByte); + from = ByteArray.toJsonHexAddress(fromByte); + to = ByteArray.toJsonHexAddress(toByte); } else { from = null; to = null; } - contractAddress = ByteArray.toJsonHex(txInfo.getContractAddress().toByteArray()); + contractAddress = ByteArray.toJsonHexAddress(txInfo.getContractAddress().toByteArray()); // 统一的log List logList = new ArrayList<>(); @@ -218,7 +218,7 @@ public TransactionReceipt(Block block, TransactionInfo txInfo, Wallet wallet) { transactionLog.blockHash = blockHash; transactionLog.blockNumber = blockNumber; byte[] addressByte = convertToTronAddress(log.getAddress().toByteArray()); - transactionLog.address = ByteArray.toJsonHex(addressByte); + transactionLog.address = ByteArray.toJsonHexAddress(addressByte); transactionLog.data = ByteArray.toJsonHex(log.getData().toByteArray()); String[] topics = new String[log.getTopicsCount()]; for (int i = 0; i < log.getTopicsCount(); i++) { From ed93072d236e4e8b1837619f6130a7b84cf8dfcb Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Tue, 29 Jun 2021 12:33:02 +0800 Subject: [PATCH 061/341] feat: modify address to remove the prefix 41 --- .../core/services/jsonrpc/TronJsonRpc.java | 8 +++--- .../services/jsonrpc/TronJsonRpcImpl.java | 28 ++++++++----------- 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index d5dda3e3e31..49a5e534810 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -268,8 +268,8 @@ public TransactionResult(Block b, int index, Transaction tx, Wallet wallet) { Contract contract = tx.getRawData().getContract(0); byte[] fromByte = TransactionCapsule.getOwner(contract); byte[] toByte = getToAddress(tx); - from = ByteArray.toJsonHex(fromByte); - to = ByteArray.toJsonHex(toByte); + from = ByteArray.toJsonHexAddress(fromByte); + to = ByteArray.toJsonHexAddress(toByte); value = ByteArray.toJsonHex(getTransactionAmount(contract, hash, wallet)); } else { from = null; @@ -281,9 +281,9 @@ public TransactionResult(Block b, int index, Transaction tx, Wallet wallet) { gasPrice = null; // no value input = null; // no value - ByteString signature = tx.getSignature(0); // r[32] + s[32] + 符号位v[1] + ByteString signature = tx.getSignature(0); // r[32] + s[32] + v[1] byte[] signData = signature.toByteArray(); - byte vByte = (byte) (signData[64] + 27); //参考函数 Base64toBytes + byte vByte = (byte) (signData[64] + 27); // according to Base64toBytes byte[] rByte = Arrays.copyOfRange(signData, 0, 32); byte[] sByte = Arrays.copyOfRange(signData, 32, 64); v = ByteArray.toJsonHex(vByte); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 07d61bce23f..f63c970f117 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -209,7 +209,7 @@ private BlockResult getBlockResult(Block block, boolean fullTx) { @Override public String getNetVersion() { - //network id,不能跟metamask已有的id冲突 + //network id return ByteArray.toJsonHex(100); } @@ -270,14 +270,13 @@ public String getTrxBalance(String address, String blockNumOrTag) { */ private String call(byte[] ownerAddressByte, byte[] contractAddressByte, byte[] data) { - //构造静态合约时,只需要3个字段 TriggerSmartContract triggerContract = triggerCallContract( ownerAddressByte, contractAddressByte, - 0, //给合约发送的trx,静态合约不需要 + 0, data, - 0, //给合约发送的 token10 的金额,静态合约不需要 - null //给合约发送的 token10 ID,静态合约不需要 + 0, + null ); TransactionExtention.Builder trxExtBuilder = TransactionExtention.newBuilder(); @@ -328,6 +327,7 @@ private String call(byte[] ownerAddressByte, byte[] contractAddressByte, byte[] } else { logger.error("trigger contract failed."); } + return result; } @@ -355,13 +355,6 @@ public String getStorageAt(String address, String storageIdx, String blockNumOrT } } - @Override - public String getSendTransactionCountOfAddress(String address, String blockNumOrTag) { - //发起人为某个地址的交易总数。FullNode无法实现该功能 - return ByteArray.toJsonHex( - wallet.getNowBlock().getBlockHeader().getRawData().getTimestamp() + 60 * 1000); - } - @Override public String getABIofSmartContract(String contractAddress, String blockNumOrTag) { if ("earliest".equalsIgnoreCase(blockNumOrTag) @@ -394,13 +387,12 @@ public String getABIofSmartContract(String contractAddress, String blockNumOrTag @Override public String getCoinbase() { - //获取最新块的产块sr地址 byte[] witnessAddress = wallet.getNowBlock().getBlockHeader().getRawData().getWitnessAddress() .toByteArray(); if (witnessAddress == null || witnessAddress.length != 21) { throw new JsonRpcApiException("invalid witness address"); } - return ByteArray.toJsonHex(witnessAddress); + return ByteArray.toJsonHexAddress(witnessAddress); } @Override @@ -638,13 +630,11 @@ public List ethGetWork() { @Override public String getHashRate() { - //读取当前挖矿节点的每秒钟哈希值算出数量,无用 return "0x0"; } @Override public boolean isMining() { - //检查节点是否在进行挖矿,无用 return false; } @@ -688,4 +678,10 @@ public String parityNextNonce(String address) { throw new UnsupportedOperationException( "the method parity_nextNonce does not exist/is not available"); } + + @Override + public String getSendTransactionCountOfAddress(String address, String blockNumOrTag) { + throw new UnsupportedOperationException( + "the method eth_getTransactionCount does not exist/is not available"); + } } From d2da178914edbcaa440f769c248048c20b6502d4 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Tue, 29 Jun 2021 15:00:16 +0800 Subject: [PATCH 062/341] typo --- .../core/services/jsonrpc/TronJsonRpcImpl.java | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index f63c970f117..fb5665f1b04 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -2,7 +2,6 @@ import static org.tron.core.Wallet.CONTRACT_VALIDATE_ERROR; import static org.tron.core.Wallet.CONTRACT_VALIDATE_EXCEPTION; -import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getMethodSign; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTxID; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.triggerCallContract; @@ -15,7 +14,6 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; -import org.spongycastle.util.encoders.Hex; import org.tron.api.GrpcAPI.BytesMessage; import org.tron.api.GrpcAPI.Return; import org.tron.api.GrpcAPI.Return.response_code; @@ -24,7 +22,6 @@ import org.tron.common.runtime.vm.DataWord; import org.tron.common.utils.ByteArray; import org.tron.common.utils.ByteUtil; -import org.tron.common.utils.Commons; import org.tron.common.utils.DecodeUtil; import org.tron.core.Wallet; import org.tron.core.capsule.BlockCapsule; @@ -48,15 +45,11 @@ public class TronJsonRpcImpl implements TronJsonRpc { String regexHash = "(0x)?[a-zA-Z0-9]{64}$"; - String regexAddressHash = "(0x)?[a-zA-Z0-9]{42}$"; private NodeInfoService nodeInfoService; private Wallet wallet; private Manager manager; - public TronJsonRpcImpl() { - } - public TronJsonRpcImpl(NodeInfoService nodeInfoService, Wallet wallet, Manager manager) { this.nodeInfoService = nodeInfoService; this.wallet = wallet; @@ -226,13 +219,11 @@ public boolean isListening() { @Override public String getProtocolVersion() { - //当前块的版本号。实际是与代码版本对应的。 return ByteArray.toJsonHex(wallet.getNowBlock().getBlockHeader().getRawData().getVersion()); } @Override public String getLatestBlockNum() { - //当前节点同步的最新块号 return ByteArray.toJsonHex(wallet.getNowBlock().getBlockHeader().getRawData().getNumber()); } @@ -242,7 +233,6 @@ public String getTrxBalance(String address, String blockNumOrTag) { || "pending".equalsIgnoreCase(blockNumOrTag)) { throw new JsonRpcApiException("TAG [earliest | pending] not supported"); } else if ("latest".equalsIgnoreCase(blockNumOrTag)) { - //某个用户的trx余额,以sun为单位 byte[] addressData = addressHashToByteArray(address); Account account = Account.newBuilder().setAddress(ByteString.copyFrom(addressData)).build(); @@ -361,7 +351,6 @@ public String getABIofSmartContract(String contractAddress, String blockNumOrTag || "pending".equalsIgnoreCase(blockNumOrTag)) { throw new JsonRpcApiException("TAG [earliest | pending] not supported"); } else if ("latest".equalsIgnoreCase(blockNumOrTag)) { - //获取某个合约地址的字节码 byte[] addressData = addressHashToByteArray(contractAddress); BytesMessage.Builder build = BytesMessage.newBuilder(); @@ -563,13 +552,12 @@ public String getCall(CallArguments transactionCall, String blockNumOrTag) { @Override public String getPeerCount() { - //返回当前节点所连接的peer节点数量 + // return the peer list count return ByteArray.toJsonHex(nodeInfoService.getNodeInfo().getPeerList().size()); } @Override public Object getSyncingStatus() { - //查询同步状态。未同步返回false,否则返回 SyncingResult if (nodeInfoService.getNodeInfo().getPeerList().isEmpty()) { return false; } @@ -590,25 +578,21 @@ public Object getSyncingStatus() { @Override public BlockResult getUncleByBlockHashAndIndex(String blockHash, int index) { - //查询指定块hash的第几个分叉 return null; } @Override public BlockResult getUncleByBlockNumberAndIndex(String blockNumOrTag, int index) { - //查询指定块号的第几个分叉 return null; } @Override public String getUncleCountByBlockHash(String blockHash) { - //查询指定块hash的分叉个数 return "0x0"; } @Override public String getUncleCountByBlockNumber(String blockNumOrTag) { - //查询指定块号的分叉个数 return "0x0"; } From 6c727255a12da42d77ede5cc642afd0c9a1af869 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Tue, 29 Jun 2021 15:01:23 +0800 Subject: [PATCH 063/341] typo --- .../org/tron/core/services/jsonrpc/TronJsonRpc.java | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 49a5e534810..a00bb708303 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -91,22 +91,11 @@ public String toString() { } class CallArguments { - - //需要采用public修饰符,否则输入参数不能被识别 - /** - * 用户地址,16进制 - */ public String from; - /** - * 合约地址,16进制 - */ public String to; public String gas; //not used public String gasPrice; //not used public String value; //not used - /** - * 函数的签名 || 输入参数列表 - */ public String data; @Override From 4c2012d5d79ceb35212ffab73c86f9728cc7ed89 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Tue, 29 Jun 2021 17:07:42 +0800 Subject: [PATCH 064/341] typo: add TransactionReceipt and TransactionResult to sperate file --- .../services/jsonrpc/TransactionReceipt.java | 137 ++++++++++++ .../services/jsonrpc/TransactionResult.java | 87 ++++++++ .../core/services/jsonrpc/TronJsonRpc.java | 211 ------------------ 3 files changed, 224 insertions(+), 211 deletions(-) create mode 100644 framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java create mode 100644 framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java new file mode 100644 index 00000000000..18164562bbf --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java @@ -0,0 +1,137 @@ +package org.tron.core.services.jsonrpc; + +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.convertToTronAddress; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getToAddress; + +import com.fasterxml.jackson.annotation.JsonInclude; +import java.util.ArrayList; +import java.util.List; +import org.tron.api.GrpcAPI.TransactionInfoList; +import org.tron.common.utils.ByteArray; +import org.tron.core.Constant; +import org.tron.core.Wallet; +import org.tron.core.capsule.BlockCapsule; +import org.tron.core.capsule.TransactionCapsule; +import org.tron.protos.Protocol; +import org.tron.protos.Protocol.ResourceReceipt; +import org.tron.protos.Protocol.Transaction.Contract; +import org.tron.protos.Protocol.TransactionInfo; + +class TransactionReceipt { + + public static class TransactionLog { + + public String logIndex; + public String blockHash; + public String blockNumber; + public String transactionIndex; + public String transactionHash; + public String address; + public String data; + public String[] topics; + + public TransactionLog() { + + } + } + + public String blockHash; + public String blockNumber; + public String transactionIndex; + public String transactionHash; + public String from; + public String to; + + public String cumulativeGasUsed; + public String gasUsed; + public String contractAddress; + public TransactionLog[] logs; + public String logsBloom; + @JsonInclude(JsonInclude.Include.NON_NULL) + public String root; // 32 bytes of post-transaction stateroot (pre Byzantium) + @JsonInclude(JsonInclude.Include.NON_NULL) + public String status; // either 1 (success) or 0 (failure) (post Byzantium) + + public TransactionReceipt(Protocol.Block block, TransactionInfo txInfo, Wallet wallet) { + BlockCapsule blockCapsule = new BlockCapsule(block); + String txid = ByteArray.toHexString(txInfo.getId().toByteArray()); + + Protocol.Transaction transaction = null; + long cumulativeGas = 0; + long cumulativeLogCount = 0; + + long sunPerEnergy = Constant.SUN_PER_ENERGY; + long dynamicEnergyFee = wallet.getEnergyFee(); + if (dynamicEnergyFee > 0) { + sunPerEnergy = dynamicEnergyFee; + } + + TransactionInfoList infoList = wallet.getTransactionInfoByBlockNum(blockCapsule.getNum()); + for (int index = 0; index < infoList.getTransactionInfoCount(); index++) { + TransactionInfo info = infoList.getTransactionInfo(index); + ResourceReceipt resourceReceipt = info.getReceipt(); + + long energyUsage = resourceReceipt.getEnergyUsage() + + resourceReceipt.getOriginEnergyUsage() + + resourceReceipt.getEnergyFee() / sunPerEnergy; + cumulativeGas += energyUsage; + + if (ByteArray.toHexString(info.getId().toByteArray()).equals(txid)) { + transactionIndex = ByteArray.toJsonHex(index); + cumulativeGasUsed = ByteArray.toJsonHex(cumulativeGas); + gasUsed = ByteArray.toJsonHex(energyUsage); + status = resourceReceipt.getResultValue() == 1 ? "0x1" : "0x0"; + + transaction = block.getTransactions(index); + break; + } else { + cumulativeLogCount += info.getLogCount(); + } + } + + blockHash = ByteArray.toJsonHex(blockCapsule.getBlockId().getBytes()); + blockNumber = ByteArray.toJsonHex(blockCapsule.getNum()); + transactionHash = ByteArray.toJsonHex(txInfo.getId().toByteArray()); + + if (transaction != null && !transaction.getRawData().getContractList().isEmpty()) { + Contract contract = transaction.getRawData().getContract(0); + byte[] fromByte = TransactionCapsule.getOwner(contract); + byte[] toByte = getToAddress(transaction); + from = ByteArray.toJsonHexAddress(fromByte); + to = ByteArray.toJsonHexAddress(toByte); + } else { + from = null; + to = null; + } + + contractAddress = ByteArray.toJsonHexAddress(txInfo.getContractAddress().toByteArray()); + + // logs + List logList = new ArrayList<>(); + for (int index = 0; index < txInfo.getLogCount(); index++) { + TransactionInfo.Log log = txInfo.getLogList().get(index); + + TransactionReceipt.TransactionLog transactionLog = new TransactionReceipt.TransactionLog(); + // index is the index in the block + transactionLog.logIndex = ByteArray.toJsonHex(index + cumulativeLogCount); + transactionLog.transactionHash = txid; + transactionLog.transactionIndex = transactionIndex; + transactionLog.blockHash = blockHash; + transactionLog.blockNumber = blockNumber; + byte[] addressByte = convertToTronAddress(log.getAddress().toByteArray()); + transactionLog.address = ByteArray.toJsonHexAddress(addressByte); + transactionLog.data = ByteArray.toJsonHex(log.getData().toByteArray()); + String[] topics = new String[log.getTopicsCount()]; + for (int i = 0; i < log.getTopicsCount(); i++) { + topics[i] = ByteArray.toJsonHex(log.getTopics(i).toByteArray()); + } + transactionLog.topics = topics; + + logList.add(transactionLog); + } + logs = logList.toArray(new TransactionReceipt.TransactionLog[logList.size()]); + logsBloom = null; // no value + + root = null; + } +} \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java new file mode 100644 index 00000000000..fb132dbfd32 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java @@ -0,0 +1,87 @@ +package org.tron.core.services.jsonrpc; + +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getToAddress; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTransactionAmount; + +import com.google.protobuf.ByteString; +import java.util.Arrays; +import org.tron.common.utils.ByteArray; +import org.tron.core.Wallet; +import org.tron.core.capsule.BlockCapsule; +import org.tron.core.capsule.TransactionCapsule; +import org.tron.protos.Protocol; +import org.tron.protos.Protocol.Transaction.Contract; + +class TransactionResult { + + public String hash; + public String nonce; + public String blockHash; + public String blockNumber; + public String transactionIndex; + + public String from; + public String to; + public String gas; + public String gasPrice; + public String value; + public String input; + + public String v; + public String r; + public String s; + + public TransactionResult(Protocol.Block b, int index, Protocol.Transaction tx, Wallet wallet) { + BlockCapsule blockCapsule = new BlockCapsule(b); + + byte[] txid = new TransactionCapsule(tx).getTransactionId().getBytes(); + hash = ByteArray.toJsonHex(txid); + nonce = null; // no value + blockHash = ByteArray.toJsonHex(blockCapsule.getBlockId().getBytes()); + blockNumber = ByteArray.toJsonHex(blockCapsule.getNum()); + transactionIndex = ByteArray.toJsonHex(index); + + if (!tx.getRawData().getContractList().isEmpty()) { + Contract contract = tx.getRawData().getContract(0); + byte[] fromByte = TransactionCapsule.getOwner(contract); + byte[] toByte = getToAddress(tx); + from = ByteArray.toJsonHexAddress(fromByte); + to = ByteArray.toJsonHexAddress(toByte); + value = ByteArray.toJsonHex(getTransactionAmount(contract, hash, wallet)); + } else { + from = null; + to = null; + value = null; + } + + gas = null; // no value + gasPrice = null; // no value + input = null; // no value + + ByteString signature = tx.getSignature(0); // r[32] + s[32] + v[1] + byte[] signData = signature.toByteArray(); + byte vByte = (byte) (signData[64] + 27); // according to Base64toBytes + byte[] rByte = Arrays.copyOfRange(signData, 0, 32); + byte[] sByte = Arrays.copyOfRange(signData, 32, 64); + v = ByteArray.toJsonHex(vByte); + r = ByteArray.toJsonHex(rByte); + s = ByteArray.toJsonHex(sByte); + } + + @Override + public String toString() { + return "TransactionResult{" + + "hash='" + hash + '\'' + + ", nonce='" + nonce + '\'' + + ", blockHash='" + blockHash + '\'' + + ", blockNumber='" + blockNumber + '\'' + + ", transactionIndex='" + transactionIndex + '\'' + + ", from='" + from + '\'' + + ", to='" + to + '\'' + + ", gas='" + gas + '\'' + + ", gasPrice='" + gasPrice + '\'' + + ", value='" + value + '\'' + + ", input='" + input + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index a00bb708303..5ff6585dc34 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -1,33 +1,15 @@ package org.tron.core.services.jsonrpc; -import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.convertToTronAddress; -import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getToAddress; -import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTransactionAmount; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.google.protobuf.ByteString; import com.googlecode.jsonrpc4j.JsonRpcError; import com.googlecode.jsonrpc4j.JsonRpcErrors; import com.googlecode.jsonrpc4j.JsonRpcMethod; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import lombok.AllArgsConstructor; import lombok.ToString; import lombok.Value; import org.springframework.stereotype.Component; -import org.tron.api.GrpcAPI.TransactionInfoList; -import org.tron.common.utils.ByteArray; -import org.tron.core.Constant; -import org.tron.core.Wallet; -import org.tron.core.capsule.BlockCapsule; -import org.tron.core.capsule.TransactionCapsule; import org.tron.core.exception.ItemNotFoundException; -import org.tron.protos.Protocol.Block; -import org.tron.protos.Protocol.ResourceReceipt; -import org.tron.protos.Protocol.Transaction; -import org.tron.protos.Protocol.Transaction.Contract; -import org.tron.protos.Protocol.TransactionInfo; @Component public interface TronJsonRpc { @@ -105,199 +87,6 @@ public String toString() { } } - class TransactionReceipt { - - public static class TransactionLog { - - public String logIndex; - public String blockHash; - public String blockNumber; - public String transactionIndex; - public String transactionHash; - public String address; - public String data; - public String[] topics; - - public TransactionLog() { - - } - } - - public String blockHash; - public String blockNumber; - public String transactionIndex; - public String transactionHash; - public String from; - public String to; - - public String cumulativeGasUsed; - public String gasUsed; - public String contractAddress; - public TransactionLog[] logs; - public String logsBloom; - @JsonInclude(JsonInclude.Include.NON_NULL) - public String root; // 32 bytes of post-transaction stateroot (pre Byzantium) - @JsonInclude(JsonInclude.Include.NON_NULL) - public String status; // either 1 (success) or 0 (failure) (post Byzantium) - - public TransactionReceipt(Block block, TransactionInfo txInfo, Wallet wallet) { - BlockCapsule blockCapsule = new BlockCapsule(block); - String txid = ByteArray.toHexString(txInfo.getId().toByteArray()); - - Transaction transaction = null; - long cumulativeGas = 0; - long cumulativeLogCount = 0; - - long sunPerEnergy = Constant.SUN_PER_ENERGY; - long dynamicEnergyFee = wallet.getEnergyFee(); - if (dynamicEnergyFee > 0) { - sunPerEnergy = dynamicEnergyFee; - } - - TransactionInfoList infoList = wallet.getTransactionInfoByBlockNum(blockCapsule.getNum()); - for (int index = 0; index < infoList.getTransactionInfoCount(); index++) { - TransactionInfo info = infoList.getTransactionInfo(index); - ResourceReceipt resourceReceipt = info.getReceipt(); - - long energyUsage = resourceReceipt.getEnergyUsage() - + resourceReceipt.getOriginEnergyUsage() - + resourceReceipt.getEnergyFee() / sunPerEnergy; - cumulativeGas += energyUsage; - - if (ByteArray.toHexString(info.getId().toByteArray()).equals(txid)) { - transactionIndex = ByteArray.toJsonHex(index); - cumulativeGasUsed = ByteArray.toJsonHex(cumulativeGas); - gasUsed = ByteArray.toJsonHex(energyUsage); - status = resourceReceipt.getResultValue() == 1 ? "0x1" : "0x0"; - - transaction = block.getTransactions(index); - break; - } else { - cumulativeLogCount += info.getLogCount(); - } - } - - blockHash = ByteArray.toJsonHex(blockCapsule.getBlockId().getBytes()); - blockNumber = ByteArray.toJsonHex(blockCapsule.getNum()); - transactionHash = ByteArray.toJsonHex(txInfo.getId().toByteArray()); - - if (transaction != null && !transaction.getRawData().getContractList().isEmpty()) { - Contract contract = transaction.getRawData().getContract(0); - byte[] fromByte = TransactionCapsule.getOwner(contract); - byte[] toByte = getToAddress(transaction); - from = ByteArray.toJsonHexAddress(fromByte); - to = ByteArray.toJsonHexAddress(toByte); - } else { - from = null; - to = null; - } - - contractAddress = ByteArray.toJsonHexAddress(txInfo.getContractAddress().toByteArray()); - - // 统一的log - List logList = new ArrayList<>(); - for (int index = 0; index < txInfo.getLogCount(); index++) { - TransactionInfo.Log log = txInfo.getLogList().get(index); - - TransactionReceipt.TransactionLog transactionLog = new TransactionReceipt.TransactionLog(); - // log的index为在这个block中的index - transactionLog.logIndex = ByteArray.toJsonHex(index + cumulativeLogCount); - transactionLog.transactionHash = txid; - transactionLog.transactionIndex = transactionIndex; - transactionLog.blockHash = blockHash; - transactionLog.blockNumber = blockNumber; - byte[] addressByte = convertToTronAddress(log.getAddress().toByteArray()); - transactionLog.address = ByteArray.toJsonHexAddress(addressByte); - transactionLog.data = ByteArray.toJsonHex(log.getData().toByteArray()); - String[] topics = new String[log.getTopicsCount()]; - for (int i = 0; i < log.getTopicsCount(); i++) { - topics[i] = ByteArray.toJsonHex(log.getTopics(i).toByteArray()); - } - transactionLog.topics = topics; - - logList.add(transactionLog); - } - logs = logList.toArray(new TransactionReceipt.TransactionLog[logList.size()]); - logsBloom = null; // no value - - root = null; - } - } - - class TransactionResult { - - public String hash; - public String nonce; - public String blockHash; - public String blockNumber; - public String transactionIndex; - - public String from; - public String to; - public String gas; - public String gasPrice; - public String value; - public String input; - - public String v; - public String r; - public String s; - - public TransactionResult(Block b, int index, Transaction tx, Wallet wallet) { - BlockCapsule blockCapsule = new BlockCapsule(b); - - byte[] txid = new TransactionCapsule(tx).getTransactionId().getBytes(); - hash = ByteArray.toJsonHex(txid); - nonce = null; // no value - blockHash = ByteArray.toJsonHex(blockCapsule.getBlockId().getBytes()); - blockNumber = ByteArray.toJsonHex(blockCapsule.getNum()); - transactionIndex = ByteArray.toJsonHex(index); - - if (!tx.getRawData().getContractList().isEmpty()) { - Contract contract = tx.getRawData().getContract(0); - byte[] fromByte = TransactionCapsule.getOwner(contract); - byte[] toByte = getToAddress(tx); - from = ByteArray.toJsonHexAddress(fromByte); - to = ByteArray.toJsonHexAddress(toByte); - value = ByteArray.toJsonHex(getTransactionAmount(contract, hash, wallet)); - } else { - from = null; - to = null; - value = null; - } - - gas = null; // no value - gasPrice = null; // no value - input = null; // no value - - ByteString signature = tx.getSignature(0); // r[32] + s[32] + v[1] - byte[] signData = signature.toByteArray(); - byte vByte = (byte) (signData[64] + 27); // according to Base64toBytes - byte[] rByte = Arrays.copyOfRange(signData, 0, 32); - byte[] sByte = Arrays.copyOfRange(signData, 32, 64); - v = ByteArray.toJsonHex(vByte); - r = ByteArray.toJsonHex(rByte); - s = ByteArray.toJsonHex(sByte); - } - - @Override - public String toString() { - return "TransactionResult{" - + "hash='" + hash + '\'' - + ", nonce='" + nonce + '\'' - + ", blockHash='" + blockHash + '\'' - + ", blockNumber='" + blockNumber + '\'' - + ", transactionIndex='" + transactionIndex + '\'' - + ", from='" + from + '\'' - + ", to='" + to + '\'' - + ", gas='" + gas + '\'' - + ", gasPrice='" + gasPrice + '\'' - + ", value='" + value + '\'' - + ", input='" + input + '\'' - + '}'; - } - } - class CompilationResult { public String code; public CompilationInfo info; From 75c0e066c6ec799a19aa32881596f5729fa463bf Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Tue, 29 Jun 2021 17:23:08 +0800 Subject: [PATCH 065/341] fix: make class public --- .../java/org/tron/core/services/jsonrpc/TransactionReceipt.java | 2 +- .../java/org/tron/core/services/jsonrpc/TransactionResult.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java index 18164562bbf..d453b7f6c9c 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java @@ -17,7 +17,7 @@ import org.tron.protos.Protocol.Transaction.Contract; import org.tron.protos.Protocol.TransactionInfo; -class TransactionReceipt { +public class TransactionReceipt { public static class TransactionLog { diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java index fb132dbfd32..3b8cd7cb307 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java @@ -12,7 +12,7 @@ import org.tron.protos.Protocol; import org.tron.protos.Protocol.Transaction.Contract; -class TransactionResult { +public class TransactionResult { public String hash; public String nonce; From de3b52bb2f133092612d3e3a17850197e9e49207 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Fri, 9 Jul 2021 22:17:14 +0800 Subject: [PATCH 066/341] feat: add buildTransaction --- .../src/main/java/org/tron/core/Wallet.java | 4 +- .../org/tron/core/services/http/Util.java | 48 ++-- .../core/services/jsonrpc/BuildArguments.java | 73 ++++++ .../services/jsonrpc/JsonRpcApiException.java | 8 - .../core/services/jsonrpc/JsonRpcApiUtil.java | 20 ++ .../jsonrpc/JsonRpcInternalError.java | 16 ++ .../jsonrpc/JsonRpcInvalidParams.java | 8 + .../jsonrpc/JsonRpcInvalidRequest.java | 16 ++ .../core/services/jsonrpc/TronJsonRpc.java | 119 +++++++-- .../services/jsonrpc/TronJsonRpcImpl.java | 239 +++++++++++++++--- 10 files changed, 471 insertions(+), 80 deletions(-) create mode 100644 framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java delete mode 100644 framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiException.java create mode 100644 framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcInternalError.java create mode 100644 framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcInvalidParams.java create mode 100644 framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcInvalidRequest.java diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index 352d42254b7..c36aaeb2d83 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -171,7 +171,7 @@ import org.tron.core.net.TronNetDelegate; import org.tron.core.net.TronNetService; import org.tron.core.net.message.TransactionMessage; -import org.tron.core.services.jsonrpc.JsonRpcApiException; +import org.tron.core.services.jsonrpc.JsonRpcInvalidParams; import org.tron.core.store.AccountIdIndexStore; import org.tron.core.store.AccountStore; import org.tron.core.store.AccountTraceStore; @@ -675,7 +675,7 @@ public Block getByJsonBlockId(String id) { try { blockNumber = ByteArray.hexToBigInteger(id).longValue(); } catch (Exception e) { - throw new JsonRpcApiException("invalid block number"); + throw new JsonRpcInvalidParams("invalid block number"); } return getBlockByNum(blockNumber); diff --git a/framework/src/main/java/org/tron/core/services/http/Util.java b/framework/src/main/java/org/tron/core/services/http/Util.java index 730daaf6223..e8364a692d5 100644 --- a/framework/src/main/java/org/tron/core/services/http/Util.java +++ b/framework/src/main/java/org/tron/core/services/http/Util.java @@ -16,7 +16,6 @@ import java.nio.charset.Charset; import java.security.InvalidParameterException; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; import javax.servlet.http.HttpServletRequest; @@ -349,15 +348,22 @@ public static Transaction setTransactionPermissionId(JSONObject jsonObject, Transaction transaction) { if (jsonObject.containsKey(PERMISSION_ID)) { int permissionId = jsonObject.getInteger(PERMISSION_ID); - if (permissionId > 0) { - Transaction.raw.Builder raw = transaction.getRawData().toBuilder(); - Transaction.Contract.Builder contract = raw.getContract(0).toBuilder() - .setPermissionId(permissionId); - raw.clearContract(); - raw.addContract(contract); - return transaction.toBuilder().setRawData(raw).build(); - } + return setTransactionPermissionId(permissionId, transaction); + } + + return transaction; + } + + public static Transaction setTransactionPermissionId(int permissionId, Transaction transaction) { + if (permissionId > 0) { + Transaction.raw.Builder raw = transaction.getRawData().toBuilder(); + Transaction.Contract.Builder contract = raw.getContract(0).toBuilder() + .setPermissionId(permissionId); + raw.clearContract(); + raw.addContract(contract); + return transaction.toBuilder().setRawData(raw).build(); } + return transaction; } @@ -365,16 +371,24 @@ public static Transaction setTransactionExtraData(JSONObject jsonObject, Transaction transaction, boolean visible) { if (jsonObject.containsKey(EXTRA_DATA)) { String data = jsonObject.getString(EXTRA_DATA); - if (data.length() > 0) { - Transaction.raw.Builder raw = transaction.getRawData().toBuilder(); - if (visible) { - raw.setData(ByteString.copyFrom(data.getBytes())); - } else { - raw.setData(ByteString.copyFrom(ByteArray.fromHexString(data))); - } - return transaction.toBuilder().setRawData(raw).build(); + return setTransactionExtraData(data, transaction, visible); + } + + return transaction; + } + + public static Transaction setTransactionExtraData(String data, Transaction transaction, + boolean visible) { + if (data.length() > 0) { + Transaction.raw.Builder raw = transaction.getRawData().toBuilder(); + if (visible) { + raw.setData(ByteString.copyFrom(data.getBytes())); + } else { + raw.setData(ByteString.copyFrom(ByteArray.fromHexString(data))); } + return transaction.toBuilder().setRawData(raw).build(); } + return transaction; } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java b/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java new file mode 100644 index 00000000000..537efcaa429 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java @@ -0,0 +1,73 @@ +package org.tron.core.services.jsonrpc; + +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.addressHashToByteArray; + +import com.google.protobuf.ByteString; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.ToString; +import org.apache.commons.lang3.StringUtils; +import org.tron.api.GrpcAPI.BytesMessage; +import org.tron.core.Wallet; +import org.tron.protos.Protocol.Transaction.Contract.ContractType; +import org.tron.protos.contract.SmartContractOuterClass.SmartContract; + +@NoArgsConstructor +@AllArgsConstructor +@ToString +public class BuildArguments { + public String from; + public String to; + public String gas; //not used + public String gasPrice; //not used + public String value; //not used + public String data; + public String nonce; + + public Long tokenId = 0L; + public Long callTokenValue = 0L; + public String abi = ""; + public Long callValue = 0L; + public Long consumeUserResourcePercent = 0L; + public Long originEnergyLimit = 0L; + public String name = ""; + public Long feeLimit = 0L; + + public Integer permissionId = 0; + public String extraData = ""; + + public boolean visible = false; + + public ContractType getContractType(Wallet wallet) { + ContractType contractType; + + // to is null + if (StringUtils.isEmpty(to) || to.equals("0x")) { + // data is null + if (StringUtils.isEmpty(data) || data.equals("0x")) { + throw new JsonRpcInvalidRequest("invalid json request"); + } + + contractType = ContractType.CreateSmartContract; + } else { + // to is not null + byte[] contractAddressData = addressHashToByteArray(to); + BytesMessage.Builder build = BytesMessage.newBuilder(); + BytesMessage bytesMessage = build.setValue(ByteString.copyFrom(contractAddressData)).build(); + SmartContract smartContract = wallet.getContract(bytesMessage); + + // check if to is smart contract + if (smartContract != null) { + contractType = ContractType.TriggerSmartContract; + } else { + if (StringUtils.isEmpty(value)) { + throw new JsonRpcInvalidRequest("invalid json request"); + } + contractType = ContractType.TransferContract; + } + } + + return contractType; + } + +} \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiException.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiException.java deleted file mode 100644 index 7a2d59c1314..00000000000 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiException.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.tron.core.services.jsonrpc; - -public class JsonRpcApiException extends RuntimeException { - - public JsonRpcApiException(String msg) { - super(msg); - } -} \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index efc38f02e0b..bc96cb33f88 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -14,7 +14,9 @@ import org.tron.common.crypto.Hash; import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.ByteArray; +import org.tron.common.utils.ByteUtil; import org.tron.common.utils.Commons; +import org.tron.common.utils.DecodeUtil; import org.tron.common.utils.Sha256Hash; import org.tron.common.utils.StringUtil; import org.tron.core.Wallet; @@ -475,4 +477,22 @@ public static long calEngergyFee(long blockNum, Wallet wallet) { return wallet.getEnergyFee(); } } + + public static byte[] addressHashToByteArray(String hash) { + byte[] bHash; + try { + bHash = ByteArray.fromHexString(hash); + if (bHash.length != DecodeUtil.ADDRESS_SIZE / 2 + && bHash.length != DecodeUtil.ADDRESS_SIZE / 2 - 1) { + throw new JsonRpcInvalidParams("invalid address hash value"); + } + + if (bHash.length == DecodeUtil.ADDRESS_SIZE / 2 - 1) { + bHash = ByteUtil.merge(new byte[] {DecodeUtil.addressPreFixByte}, bHash); + } + } catch (Exception e) { + throw new JsonRpcInvalidParams(e.getMessage()); + } + return bHash; + } } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcInternalError.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcInternalError.java new file mode 100644 index 00000000000..1d9af3c1f4f --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcInternalError.java @@ -0,0 +1,16 @@ +package org.tron.core.services.jsonrpc; + +public class JsonRpcInternalError extends RuntimeException { + + public JsonRpcInternalError() { + super(); + } + + public JsonRpcInternalError(String message) { + super(message); + } + + public JsonRpcInternalError(String message, Throwable cause) { + super(message, cause); + } +} \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcInvalidParams.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcInvalidParams.java new file mode 100644 index 00000000000..675dee358ec --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcInvalidParams.java @@ -0,0 +1,8 @@ +package org.tron.core.services.jsonrpc; + +public class JsonRpcInvalidParams extends RuntimeException { + + public JsonRpcInvalidParams(String msg) { + super(msg); + } +} \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcInvalidRequest.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcInvalidRequest.java new file mode 100644 index 00000000000..6c94a718685 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcInvalidRequest.java @@ -0,0 +1,16 @@ +package org.tron.core.services.jsonrpc; + +public class JsonRpcInvalidRequest extends RuntimeException { + + public JsonRpcInvalidRequest() { + super(); + } + + public JsonRpcInvalidRequest(String message) { + super(message); + } + + public JsonRpcInvalidRequest(String message, Throwable cause) { + super(message, cause); + } +} \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 5ff6585dc34..67148fbdd18 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -1,15 +1,20 @@ package org.tron.core.services.jsonrpc; +import com.alibaba.fastjson.JSONObject; +import com.google.gson.JsonObject; import com.googlecode.jsonrpc4j.JsonRpcError; import com.googlecode.jsonrpc4j.JsonRpcErrors; import com.googlecode.jsonrpc4j.JsonRpcMethod; import java.util.Arrays; import java.util.List; import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; import lombok.ToString; import lombok.Value; import org.springframework.stereotype.Component; import org.tron.core.exception.ItemNotFoundException; +import org.tron.protos.Protocol.Transaction; +import org.tron.protos.contract.SmartContractOuterClass.SmartContract.ABI; @Component public interface TronJsonRpc { @@ -72,6 +77,8 @@ public String toString() { } } + @NoArgsConstructor + @AllArgsConstructor class CallArguments { public String from; public String to; @@ -79,14 +86,82 @@ class CallArguments { public String gasPrice; //not used public String value; //not used public String data; + public String nonce; @Override public String toString() { - return String.format("{\"from\":\"%s\", \"to\":\"%s\", \"gas\":\"0\", \"gasPrice\":\"0\", " - + "\"value\":\"0\", \"data\":\"%s\"}", from, to, data); + return "CallArguments{" + + "from='" + from + '\'' + + ", to='" + to + '\'' + + ", gas='" + gas + '\'' + + ", gasPrice='" + gasPrice + '\'' + + ", value='" + value + '\'' + + ", data='" + data + '\'' + + ", nonce='" + nonce + '\'' + + '}'; } } + @NoArgsConstructor + @AllArgsConstructor + @ToString + class BuildArguments1 { + + public String from; + public String to; + public String gas; //not used + public String gasPrice; //not used + public String value; //not used + public String data; + public String nonce; + + public Long tokenId = 0L; + public Long callTokenValue = 0L; + public String abi = ""; + public Long callValue = 0L; + public Long consumeUserResourcePercent = 0L; + public Long originEnergyLimit = 0L; + public String name = ""; + public Long feeLimit = 0L; + + public Integer permissionId = 0; + public String extraData = ""; + + public boolean isVisible = false; + + // @Override + // public String toString() { + // return "BuildArguments{" + // + "from='" + from + '\'' + // + ", to='" + to + '\'' + // + ", gas='" + gas + '\'' + // + ", gasPrice='" + gasPrice + '\'' + // + ", value='" + value + '\'' + // + ", data='" + data + '\'' + // + ", nonce='" + nonce + '\'' + // + '}'; + // } + + } + + @NoArgsConstructor + @AllArgsConstructor + @ToString + class BuildArguments2 { + public String from; + public String to; + public String value; //not used + + public Integer permissionId; + public String extraData; + public JSONObject abi; + + // @Override + // public String toString() { + // return ""; + // } + } + class CompilationResult { public String code; public CompilationInfo info; @@ -123,36 +198,40 @@ public String toString() { } } + class TransactionJson { + public JSONObject transaction; + } + @JsonRpcMethod("web3_clientVersion") String web3ClientVersion(); @JsonRpcMethod("web3_sha3") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParams.class, code = -32602, data = "{}"), }) String web3Sha3(String data) throws Exception; @JsonRpcMethod("eth_getBlockTransactionCountByHash") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParams.class, code = -32602, data = "{}"), }) String ethGetBlockTransactionCountByHash(String blockHash) throws Exception; @JsonRpcMethod("eth_getBlockTransactionCountByNumber") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParams.class, code = -32602, data = "{}"), }) String ethGetBlockTransactionCountByNumber(String bnOrId) throws Exception; @JsonRpcMethod("eth_getBlockByHash") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParams.class, code = -32602, data = "{}"), }) BlockResult ethGetBlockByHash(String blockHash, Boolean fullTransactionObjects) throws Exception; @JsonRpcMethod("eth_getBlockByNumber") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParams.class, code = -32602, data = "{}"), }) BlockResult ethGetBlockByNumber(String bnOrId, Boolean fullTransactionObjects) throws Exception; @@ -173,13 +252,13 @@ public String toString() { @JsonRpcMethod("eth_getBalance") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParams.class, code = -32602, data = "{}"), }) String getTrxBalance(String address, String blockNumOrTag) throws ItemNotFoundException; @JsonRpcMethod("eth_getStorageAt") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParams.class, code = -32602, data = "{}"), }) String getStorageAt(String address, String storageIdx, String blockNumOrTag); @@ -188,13 +267,13 @@ public String toString() { @JsonRpcMethod("eth_getCode") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParams.class, code = -32602, data = "{}"), }) String getABIofSmartContract(String contractAddress, String bnOrId); @JsonRpcMethod("eth_coinbase") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParams.class, code = -32602, data = "{}"), }) String getCoinbase() throws Exception; @@ -230,31 +309,31 @@ public String toString() { @JsonRpcMethod("eth_getTransactionByHash") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParams.class, code = -32602, data = "{}"), }) TransactionResult getTransactionByHash(String txid); @JsonRpcMethod("eth_getTransactionByBlockHashAndIndex") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParams.class, code = -32602, data = "{}"), }) TransactionResult getTransactionByBlockHashAndIndex(String blockHash, String index); @JsonRpcMethod("eth_getTransactionByBlockNumberAndIndex") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParams.class, code = -32602, data = "{}"), }) TransactionResult getTransactionByBlockNumberAndIndex(String blockNumOrTag, String index); @JsonRpcMethod("eth_getTransactionReceipt") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParams.class, code = -32602, data = "{}"), }) TransactionReceipt getTransactionReceipt(String txid); @JsonRpcMethod("eth_call") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcApiException.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParams.class, code = -32602, data = "{}"), }) String getCall(CallArguments transactionCall, String blockNumOrTag); @@ -288,6 +367,14 @@ public String toString() { @JsonRpcMethod("eth_accounts") String[] getAccounts(); + @JsonRpcMethod("buildTransaction") + @JsonRpcErrors({ + @JsonRpcError(exception = JsonRpcInvalidRequest.class, code = -32600, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParams.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInternalError.class, code = -32603, data = "{}"), + }) + TransactionJson buildTransaction(BuildArguments args); + // not supported @JsonRpcMethod("eth_submitWork") @JsonRpcErrors({ diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index fb5665f1b04..aa64deb15c6 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -2,9 +2,13 @@ import static org.tron.core.Wallet.CONTRACT_VALIDATE_ERROR; import static org.tron.core.Wallet.CONTRACT_VALIDATE_EXCEPTION; +import static org.tron.core.services.http.Util.setTransactionExtraData; +import static org.tron.core.services.http.Util.setTransactionPermissionId; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.addressHashToByteArray; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTxID; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.triggerCallContract; +import com.alibaba.fastjson.JSON; import com.google.protobuf.ByteString; import java.math.BigInteger; import java.util.ArrayList; @@ -14,6 +18,8 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; import org.tron.api.GrpcAPI.BytesMessage; import org.tron.api.GrpcAPI.Return; import org.tron.api.GrpcAPI.Return.response_code; @@ -22,7 +28,6 @@ import org.tron.common.runtime.vm.DataWord; import org.tron.common.utils.ByteArray; import org.tron.common.utils.ByteUtil; -import org.tron.common.utils.DecodeUtil; import org.tron.core.Wallet; import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.TransactionCapsule; @@ -30,6 +35,8 @@ import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.VMIllegalException; import org.tron.core.services.NodeInfoService; +import org.tron.core.services.http.JsonFormat; +import org.tron.core.services.http.Util; import org.tron.core.store.StorageRowStore; import org.tron.core.vm.program.Storage; import org.tron.program.Version; @@ -38,7 +45,10 @@ import org.tron.protos.Protocol.Transaction; import org.tron.protos.Protocol.Transaction.Contract.ContractType; import org.tron.protos.Protocol.TransactionInfo; +import org.tron.protos.contract.BalanceContract.TransferContract; +import org.tron.protos.contract.SmartContractOuterClass.CreateSmartContract; import org.tron.protos.contract.SmartContractOuterClass.SmartContract; +import org.tron.protos.contract.SmartContractOuterClass.SmartContract.ABI; import org.tron.protos.contract.SmartContractOuterClass.TriggerSmartContract; @Slf4j(topic = "API") @@ -76,7 +86,7 @@ public String web3Sha3(String data) { try { input = ByteArray.fromHexString(data); } catch (Exception e) { - throw new JsonRpcApiException("invalid input value"); + throw new JsonRpcInvalidParams("invalid input value"); } byte[] result = Hash.sha3(input); @@ -120,32 +130,14 @@ public BlockResult ethGetBlockByNumber(String blockNumOrTag, Boolean fullTransac private byte[] hashToByteArray(String hash) { if (!Pattern.matches(regexHash, hash)) { - throw new JsonRpcApiException("invalid hash value"); + throw new JsonRpcInvalidParams("invalid hash value"); } byte[] bHash; try { bHash = ByteArray.fromHexString(hash); } catch (Exception e) { - throw new JsonRpcApiException(e.getMessage()); - } - return bHash; - } - - private byte[] addressHashToByteArray(String hash) { - byte[] bHash; - try { - bHash = ByteArray.fromHexString(hash); - if (bHash.length != DecodeUtil.ADDRESS_SIZE / 2 - && bHash.length != DecodeUtil.ADDRESS_SIZE / 2 - 1) { - throw new JsonRpcApiException("invalid address hash value"); - } - - if (bHash.length == DecodeUtil.ADDRESS_SIZE / 2 - 1) { - bHash = ByteUtil.merge(new byte[] {DecodeUtil.addressPreFixByte}, bHash); - } - } catch (Exception e) { - throw new JsonRpcApiException(e.getMessage()); + throw new JsonRpcInvalidParams(e.getMessage()); } return bHash; } @@ -231,7 +223,7 @@ public String getLatestBlockNum() { public String getTrxBalance(String address, String blockNumOrTag) { if ("earliest".equalsIgnoreCase(blockNumOrTag) || "pending".equalsIgnoreCase(blockNumOrTag)) { - throw new JsonRpcApiException("TAG [earliest | pending] not supported"); + throw new JsonRpcInvalidParams("TAG [earliest | pending] not supported"); } else if ("latest".equalsIgnoreCase(blockNumOrTag)) { byte[] addressData = addressHashToByteArray(address); @@ -247,10 +239,10 @@ public String getTrxBalance(String address, String blockNumOrTag) { try { ByteArray.hexToBigInteger(blockNumOrTag); } catch (Exception e) { - throw new JsonRpcApiException("invalid block number"); + throw new JsonRpcInvalidParams("invalid block number"); } - throw new JsonRpcApiException("QUANTITY not supported, just support TAG as latest"); + throw new JsonRpcInvalidParams("QUANTITY not supported, just support TAG as latest"); } } @@ -325,7 +317,7 @@ private String call(byte[] ownerAddressByte, byte[] contractAddressByte, byte[] public String getStorageAt(String address, String storageIdx, String blockNumOrTag) { if ("earliest".equalsIgnoreCase(blockNumOrTag) || "pending".equalsIgnoreCase(blockNumOrTag)) { - throw new JsonRpcApiException("TAG [earliest | pending] not supported"); + throw new JsonRpcInvalidParams("TAG [earliest | pending] not supported"); } else if ("latest".equalsIgnoreCase(blockNumOrTag)) { byte[] addressByte = addressHashToByteArray(address); @@ -338,10 +330,10 @@ public String getStorageAt(String address, String storageIdx, String blockNumOrT try { ByteArray.hexToBigInteger(blockNumOrTag); } catch (Exception e) { - throw new JsonRpcApiException("invalid block number"); + throw new JsonRpcInvalidParams("invalid block number"); } - throw new JsonRpcApiException("QUANTITY not supported, just support TAG as latest"); + throw new JsonRpcInvalidParams("QUANTITY not supported, just support TAG as latest"); } } @@ -349,7 +341,7 @@ public String getStorageAt(String address, String storageIdx, String blockNumOrT public String getABIofSmartContract(String contractAddress, String blockNumOrTag) { if ("earliest".equalsIgnoreCase(blockNumOrTag) || "pending".equalsIgnoreCase(blockNumOrTag)) { - throw new JsonRpcApiException("TAG [earliest | pending] not supported"); + throw new JsonRpcInvalidParams("TAG [earliest | pending] not supported"); } else if ("latest".equalsIgnoreCase(blockNumOrTag)) { byte[] addressData = addressHashToByteArray(contractAddress); @@ -367,10 +359,10 @@ public String getABIofSmartContract(String contractAddress, String blockNumOrTag try { ByteArray.hexToBigInteger(blockNumOrTag); } catch (Exception e) { - throw new JsonRpcApiException("invalid block number"); + throw new JsonRpcInvalidParams("invalid block number"); } - throw new JsonRpcApiException("QUANTITY not supported, just support TAG as latest"); + throw new JsonRpcInvalidParams("QUANTITY not supported, just support TAG as latest"); } } @@ -379,7 +371,7 @@ public String getCoinbase() { byte[] witnessAddress = wallet.getNowBlock().getBlockHeader().getRawData().getWitnessAddress() .toByteArray(); if (witnessAddress == null || witnessAddress.length != 21) { - throw new JsonRpcApiException("invalid witness address"); + throw new JsonRpcInvalidParams("invalid witness address"); } return ByteArray.toJsonHexAddress(witnessAddress); } @@ -479,7 +471,7 @@ public TransactionResult getTransactionByBlockAndIndex(Block block, String index try { txIndex = ByteArray.jsonHexToInt(index); } catch (Exception e) { - throw new JsonRpcApiException("invalid index value"); + throw new JsonRpcInvalidParams("invalid index value"); } if (txIndex >= block.getTransactionsCount()) { @@ -532,7 +524,7 @@ public TransactionReceipt getTransactionReceipt(String txid) { public String getCall(CallArguments transactionCall, String blockNumOrTag) { if ("earliest".equalsIgnoreCase(blockNumOrTag) || "pending".equalsIgnoreCase(blockNumOrTag)) { - throw new JsonRpcApiException("TAG [earliest | pending] not supported"); + throw new JsonRpcInvalidParams("TAG [earliest | pending] not supported"); } else if ("latest".equalsIgnoreCase(blockNumOrTag)) { //静态调用合约方法。 byte[] addressData = addressHashToByteArray(transactionCall.from); @@ -543,10 +535,10 @@ public String getCall(CallArguments transactionCall, String blockNumOrTag) { try { ByteArray.hexToBigInteger(blockNumOrTag).longValue(); } catch (Exception e) { - throw new JsonRpcApiException("invalid block number"); + throw new JsonRpcInvalidParams("invalid block number"); } - throw new JsonRpcApiException("QUANTITY not supported, just support TAG as latest"); + throw new JsonRpcInvalidParams("QUANTITY not supported, just support TAG as latest"); } } @@ -568,7 +560,7 @@ public Object getSyncingStatus() { long diff = (System.currentTimeMillis() - nowBlock.getBlockHeader().getRawData().getTimestamp()) / 3000; diff = diff > 0 ? diff : 0; - long highestBlockNum = currentBlockNum + diff; //预测的最高块号 + long highestBlockNum = currentBlockNum + diff; // estimated the highest block number return new SyncingResult(ByteArray.toJsonHex(startingBlockNum), ByteArray.toJsonHex(currentBlockNum), @@ -627,6 +619,179 @@ public String[] getAccounts() { return new String[0]; } + private TransactionJson buildCreateSmartContractTransaction(byte[] ownerAddress, + BuildArguments args) { + try { + CreateSmartContract.Builder build = CreateSmartContract.newBuilder(); + + build.setOwnerAddress(ByteString.copyFrom(ownerAddress)); + + build.setCallTokenValue(args.callTokenValue) + .setTokenId(args.tokenId); + + ABI.Builder abiBuilder = ABI.newBuilder(); + if (StringUtils.isNotEmpty(args.abi)) { + StringBuffer abiSB = new StringBuffer("{"); + abiSB.append("\"entrys\":"); + abiSB.append(args.abi); + abiSB.append("}"); + JsonFormat.merge(abiSB.toString(), abiBuilder, args.visible); + } + + SmartContract.Builder smartBuilder = SmartContract.newBuilder(); + smartBuilder + .setAbi(abiBuilder) + .setCallValue(args.callValue) + .setConsumeUserResourcePercent(args.consumeUserResourcePercent) + .setOriginEnergyLimit(args.originEnergyLimit); + + // todo ownerAddress is empty? + if (ArrayUtils.isNotEmpty(ownerAddress)) { + smartBuilder.setOriginAddress(ByteString.copyFrom(ownerAddress)); + } + + // bytecode + parameter + smartBuilder.setBytecode(ByteString.copyFrom(ByteArray.fromHexString(args.data))); + + if (StringUtils.isNotEmpty(args.name)) { + smartBuilder.setName(args.name); + } + + build.setNewContract(smartBuilder); + + Transaction tx = wallet + .createTransactionCapsule(build.build(), ContractType.CreateSmartContract).getInstance(); + Transaction.Builder txBuilder = tx.toBuilder(); + Transaction.raw.Builder rawBuilder = tx.getRawData().toBuilder(); + rawBuilder.setFeeLimit(args.feeLimit); + + txBuilder.setRawData(rawBuilder); + tx = setTransactionPermissionId(args.permissionId, txBuilder.build()); + + TransactionJson transactionJson = new TransactionJson(); + transactionJson.transaction = JSON.parseObject(Util.printCreateTransaction(tx, false)); + + return transactionJson; + } catch (Exception e) { + throw new JsonRpcInvalidParams(e.getMessage()); + } + } + + private TransactionJson buildTransferContractTransaction(byte[] ownerAddress, + BuildArguments args) { + long amount; + try { + amount = ByteArray.hexToBigInteger(args.value).longValue(); + } catch (Exception e) { + throw new JsonRpcInvalidParams("invalid input value"); + } + + TransferContract.Builder build = TransferContract.newBuilder(); + build.setOwnerAddress(ByteString.copyFrom(ownerAddress)) + .setToAddress(ByteString.copyFrom(addressHashToByteArray(args.to))) + .setAmount(amount); + + try { + Transaction tx = wallet.createTransactionCapsule(build.build(), ContractType.TransferContract) + .getInstance(); + tx = setTransactionPermissionId(args.permissionId, tx); + tx = setTransactionExtraData(args.extraData, tx, args.visible); + + String jsonString = Util.printCreateTransaction(tx, args.visible); + + TransactionJson transactionJson = new TransactionJson(); + transactionJson.transaction = JSON.parseObject(jsonString); + + return transactionJson; + } catch (Exception e) { + throw new JsonRpcInternalError(e.getMessage()); + } + } + + // from and to should not be null + private TransactionJson buildTriggerSmartContractTransaction(byte[] ownerAddress, + BuildArguments args) { + byte[] contractAddress = addressHashToByteArray(args.to); + + TriggerSmartContract.Builder build = TriggerSmartContract.newBuilder(); + TransactionExtention.Builder trxExtBuilder = TransactionExtention.newBuilder(); + Return.Builder retBuilder = Return.newBuilder(); + + try { + + build.setOwnerAddress(ByteString.copyFrom(ownerAddress)) + .setContractAddress(ByteString.copyFrom(contractAddress)); + + if (StringUtils.isNotEmpty(args.data)) { + build.setData(ByteString.copyFrom(ByteArray.fromHexString(args.data))); + } else { + build.setData(ByteString.copyFrom(new byte[0])); + } + + build.setCallTokenValue(args.callTokenValue) + .setTokenId(args.tokenId) + .setCallValue(args.callValue); + + TransactionCapsule trxCap = wallet + .createTransactionCapsule(build.build(), ContractType.TriggerSmartContract); + + Transaction.Builder txBuilder = trxCap.getInstance().toBuilder(); + Transaction.raw.Builder rawBuilder = trxCap.getInstance().getRawData().toBuilder(); + rawBuilder.setFeeLimit(args.feeLimit); + txBuilder.setRawData(rawBuilder); + + Transaction trx = wallet + .triggerContract(build.build(), new TransactionCapsule(txBuilder.build()), trxExtBuilder, + retBuilder); + trx = setTransactionPermissionId(args.permissionId, trx); + trxExtBuilder.setTransaction(trx); + retBuilder.setResult(true).setCode(response_code.SUCCESS); + } catch (ContractValidateException e) { + retBuilder.setResult(false).setCode(response_code.CONTRACT_VALIDATE_ERROR) + .setMessage(ByteString.copyFromUtf8(e.getMessage())); + } catch (Exception e) { + String errString = null; + if (e.getMessage() != null) { + errString = e.getMessage().replaceAll("[\"]", "\'"); + } + retBuilder.setResult(false).setCode(response_code.OTHER_ERROR) + .setMessage(ByteString.copyFromUtf8(e.getClass() + " : " + errString)); + } + + trxExtBuilder.setResult(retBuilder); + + String jsonString = Util.printTransactionExtention(trxExtBuilder.build(), args.visible); + TransactionJson transactionJson = new TransactionJson(); + transactionJson.transaction = JSON.parseObject(jsonString); + + return transactionJson; + } + + @Override + public TransactionJson buildTransaction(BuildArguments args) { + byte[] fromAddressData; + try { + fromAddressData = addressHashToByteArray(args.from); + } catch (JsonRpcInvalidParams e) { + throw new JsonRpcInvalidRequest("invalid json request"); + } + + // check possible ContractType + ContractType contractType = args.getContractType(wallet); + switch (contractType.getNumber()) { + case ContractType.CreateSmartContract_VALUE: + return buildCreateSmartContractTransaction(fromAddressData, args); + case ContractType.TriggerSmartContract_VALUE: + return buildTriggerSmartContractTransaction(fromAddressData, args); + case ContractType.TransferContract_VALUE: + return buildTransferContractTransaction(fromAddressData, args); + default: + break; + } + + return null; + } + @Override public boolean ethSubmitWork(String nonceHex, String headerHex, String digestHex) { throw new UnsupportedOperationException( From ee63cbabbe15f192aaadc8af110df9c810de00b0 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Tue, 13 Jul 2021 18:39:07 +0800 Subject: [PATCH 067/341] feat: update config, and max count control --- .../common/parameter/CommonParameter.java | 2 +- .../src/main/java/org/tron/core/Constant.java | 11 ++-- .../java/org/tron/core/config/args/Args.java | 14 ++--- .../JsonRpcServiceOnPBFT.java | 11 ++-- .../JsonRpcServiceOnSolidity.java | 11 ++-- .../jsonrpc/FullNodeJsonRpcHttpService.java | 24 ++++++-- .../core/services/jsonrpc/JsonRpcServlet.java | 7 +-- .../core/services/jsonrpc/TronJsonRpc.java | 60 ------------------- 8 files changed, 45 insertions(+), 95 deletions(-) diff --git a/common/src/main/java/org/tron/common/parameter/CommonParameter.java b/common/src/main/java/org/tron/common/parameter/CommonParameter.java index 0fdf72997ed..f6fc5cc02b9 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -170,7 +170,7 @@ public class CommonParameter { public int solidityHttpPort; @Getter @Setter - public int jsonRpcHttpPort; + public int fullNodeJsonRpcHttpPort; @Getter @Setter public int solidityJsonRpcHttpPort; diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index 4f94c989184..3ff4a230641 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -94,13 +94,14 @@ public class Constant { public static final String NODE_HTTP_FULLNODE_ENABLE = "node.http.fullNodeEnable"; public static final String NODE_HTTP_SOLIDITY_ENABLE = "node.http.solidityEnable"; public static final String NODE_HTTP_PBFT_PORT = "node.http.PBFTPort"; - public static final String NODE_HTTP_JSONRPC_PORT = "node.http.jsonRpcPort"; - public static final String NODE_HTTP_JSONRPC_ENABLE = "node.http.jsonRpcEnable"; - public static final String NODE_HTTP_JSONRPC_SOLIDITY_PORT = "node.http.jsonRpcSolidityPort"; + public static final String NODE_ENERGY_COST = "node.http.energyCost"; + + public static final String NODE_HTTP_JSONRPC_FULLNODE_ENABLE = "node.http.jsonRpcFullNodeEnable"; + public static final String NODE_HTTP_JSONRPC_FULLNODE_PORT = "node.http.jsonRpcFullNodePort"; public static final String NODE_HTTP_JSONRPC_SOLIDITY_ENABLE = "node.http.jsonRpcSolidityEnable"; - public static final String NODE_HTTP_JSONRPC_PBFT_PORT = "node.http.jsonRpcPBFTPort"; + public static final String NODE_HTTP_JSONRPC_SOLIDITY_PORT = "node.http.jsonRpcSolidityPort"; public static final String NODE_HTTP_JSONRPC_PBFT_ENABLE = "node.http.jsonRpcPBFTEnable"; - public static final String NODE_ENERGY_COST = "node.http.energyCost"; + public static final String NODE_HTTP_JSONRPC_PBFT_PORT = "node.http.jsonRpcPBFTPort"; public static final String NODE_RPC_THREAD = "node.rpc.thread"; public static final String NODE_SOLIDITY_THREADS = "node.solidity.threads"; diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index a1c01eaa7d8..1218fca840c 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -23,7 +23,6 @@ import java.util.Collections; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.concurrent.BlockingQueue; @@ -133,7 +132,7 @@ public static void clearParam() { PARAMETER.fullNodeHttpPort = 0; PARAMETER.solidityHttpPort = 0; PARAMETER.pBFTHttpPort = 0; - PARAMETER.jsonRpcHttpPort = 0; + PARAMETER.fullNodeJsonRpcHttpPort = 0; PARAMETER.solidityJsonRpcHttpPort = 0; PARAMETER.pBFTJsonRpcHttpPort = 0; PARAMETER.energyCost = ""; @@ -297,8 +296,9 @@ public static void setParam(final String[] args, final String confFileName) { PARAMETER.solidityNodeHttpEnable = config.getBoolean(Constant.NODE_HTTP_SOLIDITY_ENABLE); } - if (config.hasPath(Constant.NODE_HTTP_JSONRPC_ENABLE)) { - PARAMETER.fullNodeHttpJsonRpcEnable = config.getBoolean(Constant.NODE_HTTP_JSONRPC_ENABLE); + if (config.hasPath(Constant.NODE_HTTP_JSONRPC_FULLNODE_ENABLE)) { + PARAMETER.fullNodeHttpJsonRpcEnable = + config.getBoolean(Constant.NODE_HTTP_JSONRPC_FULLNODE_ENABLE); } if (config.hasPath(Constant.NODE_HTTP_JSONRPC_SOLIDITY_ENABLE)) { @@ -472,9 +472,9 @@ public static void setParam(final String[] args, final String confFileName) { config.hasPath(Constant.NODE_HTTP_PBFT_PORT) ? config.getInt(Constant.NODE_HTTP_PBFT_PORT) : 8092; - PARAMETER.jsonRpcHttpPort = - config.hasPath(Constant.NODE_HTTP_JSONRPC_PORT) - ? config.getInt(Constant.NODE_HTTP_JSONRPC_PORT) : 8093; + PARAMETER.fullNodeJsonRpcHttpPort = + config.hasPath(Constant.NODE_HTTP_JSONRPC_FULLNODE_PORT) + ? config.getInt(Constant.NODE_HTTP_JSONRPC_FULLNODE_PORT) : 8093; PARAMETER.solidityJsonRpcHttpPort = config.hasPath(Constant.NODE_HTTP_JSONRPC_SOLIDITY_PORT) diff --git a/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnPBFT/JsonRpcServiceOnPBFT.java b/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnPBFT/JsonRpcServiceOnPBFT.java index 0b44791a466..e258b92518f 100644 --- a/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnPBFT/JsonRpcServiceOnPBFT.java +++ b/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnPBFT/JsonRpcServiceOnPBFT.java @@ -1,6 +1,7 @@ package org.tron.core.services.interfaceJsonRpcOnPBFT; import lombok.extern.slf4j.Slf4j; +import org.eclipse.jetty.server.ConnectionLimit; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; @@ -38,12 +39,10 @@ public void start() { context.addServlet(new ServletHolder(jsonRpcOnPBFTServlet), "/jsonrpc"); - // filter - // ServletHandler handler = new ServletHandler(); - // FilterHolder fh = handler - // .addFilterWithMapping((Class) HttpInterceptor.class, "/*", - // EnumSet.of(DispatcherType.REQUEST)); - // context.addFilter(fh, "/*", EnumSet.of(DispatcherType.REQUEST)); + int maxHttpConnectNumber = CommonParameter.getInstance().getMaxHttpConnectNumber(); + if (maxHttpConnectNumber > 0) { + server.addBean(new ConnectionLimit(maxHttpConnectNumber, server)); + } server.start(); diff --git a/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcServiceOnSolidity.java b/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcServiceOnSolidity.java index d6a4061cab9..60c16b72c3e 100644 --- a/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcServiceOnSolidity.java +++ b/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcServiceOnSolidity.java @@ -1,6 +1,7 @@ package org.tron.core.services.interfaceJsonRpcOnSolidity; import lombok.extern.slf4j.Slf4j; +import org.eclipse.jetty.server.ConnectionLimit; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; @@ -38,12 +39,10 @@ public void start() { context.addServlet(new ServletHolder(jsonRpcOnSolidityServlet), "/jsonrpc"); - // filter - // ServletHandler handler = new ServletHandler(); - // FilterHolder fh = handler - // .addFilterWithMapping((Class) HttpInterceptor.class, "/*", - // EnumSet.of(DispatcherType.REQUEST)); - // context.addFilter(fh, "/*", EnumSet.of(DispatcherType.REQUEST)); + int maxHttpConnectNumber = CommonParameter.getInstance().getMaxHttpConnectNumber(); + if (maxHttpConnectNumber > 0) { + server.addBean(new ConnectionLimit(maxHttpConnectNumber, server)); + } server.start(); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java index 1878db28d48..c50c1e572ab 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java @@ -1,19 +1,26 @@ package org.tron.core.services.jsonrpc; +import java.util.EnumSet; +import javax.servlet.DispatcherType; +import javax.servlet.Filter; import lombok.extern.slf4j.Slf4j; +import org.eclipse.jetty.server.ConnectionLimit; import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.servlet.ServletHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.tron.common.application.Service; import org.tron.common.parameter.CommonParameter; +import org.tron.core.services.filter.HttpInterceptor; @Component @Slf4j(topic = "API") public class FullNodeJsonRpcHttpService implements Service { - private int port = CommonParameter.getInstance().getJsonRpcHttpPort(); + private int port = CommonParameter.getInstance().getFullNodeJsonRpcHttpPort(); private Server server; @@ -38,12 +45,17 @@ public void start() { context.addServlet(new ServletHolder(jsonRpcServlet), "/jsonrpc"); + int maxHttpConnectNumber = CommonParameter.getInstance().getMaxHttpConnectNumber(); + if (maxHttpConnectNumber > 0) { + server.addBean(new ConnectionLimit(maxHttpConnectNumber, server)); + } + // filter - // ServletHandler handler = new ServletHandler(); - // FilterHolder fh = handler - // .addFilterWithMapping((Class) HttpInterceptor.class, "/*", - // EnumSet.of(DispatcherType.REQUEST)); - // context.addFilter(fh, "/*", EnumSet.of(DispatcherType.REQUEST)); + ServletHandler handler = new ServletHandler(); + FilterHolder fh = handler + .addFilterWithMapping((Class) HttpInterceptor.class, "/*", + EnumSet.of(DispatcherType.REQUEST)); + context.addFilter(fh, "/*", EnumSet.of(DispatcherType.REQUEST)); server.start(); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java index d0874604f3f..20e81eb30e7 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java @@ -19,9 +19,7 @@ @Slf4j(topic = "API") public class JsonRpcServlet extends RateLimiterServlet { - private static final long serialVersionUID = 12341234345L; private JsonRpcServer rpcServer = null; - private TronJsonRpcImpl testServiceImpl; @Autowired private NodeInfoService nodeInfoService; @@ -33,10 +31,11 @@ public class JsonRpcServlet extends RateLimiterServlet { // @Override public void init(ServletConfig config) throws ServletException { super.init(config); - testServiceImpl = new TronJsonRpcImpl(nodeInfoService, wallet, manager); + + TronJsonRpcImpl jsonRpcImpl = new TronJsonRpcImpl(nodeInfoService, wallet, manager); Object compositeService = ProxyUtil.createCompositeServiceProxy( this.getClass().getClassLoader(), - new Object[] {testServiceImpl}, + new Object[] {jsonRpcImpl}, new Class[] {TronJsonRpc.class}, true); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 67148fbdd18..65a7c805c34 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -102,66 +102,6 @@ public String toString() { } } - @NoArgsConstructor - @AllArgsConstructor - @ToString - class BuildArguments1 { - - public String from; - public String to; - public String gas; //not used - public String gasPrice; //not used - public String value; //not used - public String data; - public String nonce; - - public Long tokenId = 0L; - public Long callTokenValue = 0L; - public String abi = ""; - public Long callValue = 0L; - public Long consumeUserResourcePercent = 0L; - public Long originEnergyLimit = 0L; - public String name = ""; - public Long feeLimit = 0L; - - public Integer permissionId = 0; - public String extraData = ""; - - public boolean isVisible = false; - - // @Override - // public String toString() { - // return "BuildArguments{" - // + "from='" + from + '\'' - // + ", to='" + to + '\'' - // + ", gas='" + gas + '\'' - // + ", gasPrice='" + gasPrice + '\'' - // + ", value='" + value + '\'' - // + ", data='" + data + '\'' - // + ", nonce='" + nonce + '\'' - // + '}'; - // } - - } - - @NoArgsConstructor - @AllArgsConstructor - @ToString - class BuildArguments2 { - public String from; - public String to; - public String value; //not used - - public Integer permissionId; - public String extraData; - public JSONObject abi; - - // @Override - // public String toString() { - // return ""; - // } - } - class CompilationResult { public String code; public CompilationInfo info; From da8adbb26a7aae572469ae19f1b9716d0a4b8647 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 14 Jul 2021 18:54:40 +0800 Subject: [PATCH 068/341] feat: customize HttpStatusCodeProvider --- .../tron/core/services/jsonrpc/JsonRpcApiUtil.java | 6 +++++- .../tron/core/services/jsonrpc/JsonRpcServlet.java | 13 +++++++++++++ .../org/tron/core/services/jsonrpc/TronJsonRpc.java | 3 --- .../tron/core/services/jsonrpc/TronJsonRpcImpl.java | 6 +++++- 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index bc96cb33f88..1ec68bf57f4 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -9,6 +9,7 @@ import java.util.Iterator; import java.util.List; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.spongycastle.util.encoders.Hex; import org.tron.api.GrpcAPI.AssetIssueList; import org.tron.common.crypto.Hash; @@ -148,14 +149,17 @@ public static String getMethodSign(String method) { public static TriggerSmartContract triggerCallContract(byte[] address, byte[] contractAddress, long callValue, byte[] data, long tokenValue, String tokenId) { TriggerSmartContract.Builder builder = TriggerSmartContract.newBuilder(); + builder.setOwnerAddress(ByteString.copyFrom(address)); builder.setContractAddress(ByteString.copyFrom(contractAddress)); builder.setData(ByteString.copyFrom(data)); builder.setCallValue(callValue); - if (tokenId != null && tokenId != "") { + + if (StringUtils.isNotEmpty(tokenId)) { builder.setCallTokenValue(tokenValue); builder.setTokenId(Long.parseLong(tokenId)); } + return builder.build(); } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java index 20e81eb30e7..d89258e4b63 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java @@ -1,5 +1,6 @@ package org.tron.core.services.jsonrpc; +import com.googlecode.jsonrpc4j.HttpStatusCodeProvider; import com.googlecode.jsonrpc4j.JsonRpcServer; import com.googlecode.jsonrpc4j.ProxyUtil; import java.io.IOException; @@ -40,6 +41,18 @@ public void init(ServletConfig config) throws ServletException { true); rpcServer = new JsonRpcServer(compositeService); + HttpStatusCodeProvider httpStatusCodeProvider = new HttpStatusCodeProvider() { + @Override + public int getHttpStatusCode(int resultCode) { + return 200; + } + + @Override + public Integer getJsonRpcCode(int httpStatusCode) { + return null; + } + }; + rpcServer.setHttpStatusCodeProvider(httpStatusCodeProvider); } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 65a7c805c34..5756bee1375 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -1,7 +1,6 @@ package org.tron.core.services.jsonrpc; import com.alibaba.fastjson.JSONObject; -import com.google.gson.JsonObject; import com.googlecode.jsonrpc4j.JsonRpcError; import com.googlecode.jsonrpc4j.JsonRpcErrors; import com.googlecode.jsonrpc4j.JsonRpcMethod; @@ -13,8 +12,6 @@ import lombok.Value; import org.springframework.stereotype.Component; import org.tron.core.exception.ItemNotFoundException; -import org.tron.protos.Protocol.Transaction; -import org.tron.protos.contract.SmartContractOuterClass.SmartContract.ABI; @Component public interface TronJsonRpc { diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index aa64deb15c6..109d2b1a964 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -672,8 +672,10 @@ private TransactionJson buildCreateSmartContractTransaction(byte[] ownerAddress, transactionJson.transaction = JSON.parseObject(Util.printCreateTransaction(tx, false)); return transactionJson; + } catch(ContractValidateException e) { + throw new JsonRpcInvalidRequest(e.getMessage()); } catch (Exception e) { - throw new JsonRpcInvalidParams(e.getMessage()); + throw new JsonRpcInternalError(e.getMessage()); } } @@ -703,6 +705,8 @@ private TransactionJson buildTransferContractTransaction(byte[] ownerAddress, transactionJson.transaction = JSON.parseObject(jsonString); return transactionJson; + } catch(ContractValidateException e) { + throw new JsonRpcInvalidRequest(e.getMessage()); } catch (Exception e) { throw new JsonRpcInternalError(e.getMessage()); } From 308f23da98fe6c0351c206d78faa5d7ef0d28690 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 14 Jul 2021 19:20:30 +0800 Subject: [PATCH 069/341] feat: value to callValue --- .../java/org/tron/common/utils/ByteArray.java | 7 +++++++ .../core/services/jsonrpc/BuildArguments.java | 21 ++++++++++++++++--- .../services/jsonrpc/TronJsonRpcImpl.java | 4 ++-- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/common/src/main/java/org/tron/common/utils/ByteArray.java b/common/src/main/java/org/tron/common/utils/ByteArray.java index 5327aafd4c8..ea2ffeaf13c 100644 --- a/common/src/main/java/org/tron/common/utils/ByteArray.java +++ b/common/src/main/java/org/tron/common/utils/ByteArray.java @@ -146,6 +146,13 @@ public static BigInteger hexToBigInteger(String input) { } } + public static long jsonHexToLong(String x) throws Exception { + if (!x.startsWith("0x")) + throw new Exception("Incorrect hex syntax"); + x = x.substring(2); + return Long.parseLong(x, 16); + } + public static int jsonHexToInt(String x) throws Exception { if (!x.startsWith("0x")) throw new Exception("Incorrect hex syntax"); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java b/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java index 537efcaa429..7d031d89afe 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java @@ -8,6 +8,7 @@ import lombok.ToString; import org.apache.commons.lang3.StringUtils; import org.tron.api.GrpcAPI.BytesMessage; +import org.tron.common.utils.ByteArray; import org.tron.core.Wallet; import org.tron.protos.Protocol.Transaction.Contract.ContractType; import org.tron.protos.contract.SmartContractOuterClass.SmartContract; @@ -20,14 +21,14 @@ public class BuildArguments { public String to; public String gas; //not used public String gasPrice; //not used - public String value; //not used + public String value; public String data; - public String nonce; + public String nonce; //not used public Long tokenId = 0L; public Long callTokenValue = 0L; public String abi = ""; - public Long callValue = 0L; + // public Long callValue = 0L; public Long consumeUserResourcePercent = 0L; public Long originEnergyLimit = 0L; public String name = ""; @@ -70,4 +71,18 @@ public ContractType getContractType(Wallet wallet) { return contractType; } + public long parseCallValue() { + long callValue = 0L; + + if (StringUtils.isNotEmpty(value)) { + try { + callValue = ByteArray.jsonHexToLong(value); + } catch (Exception e) { + throw new JsonRpcInvalidParams("invalid hex number"); + } + } + + return callValue; + } + } \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 109d2b1a964..843f5dcb220 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -641,7 +641,7 @@ private TransactionJson buildCreateSmartContractTransaction(byte[] ownerAddress, SmartContract.Builder smartBuilder = SmartContract.newBuilder(); smartBuilder .setAbi(abiBuilder) - .setCallValue(args.callValue) + .setCallValue(args.parseCallValue()) .setConsumeUserResourcePercent(args.consumeUserResourcePercent) .setOriginEnergyLimit(args.originEnergyLimit); @@ -734,7 +734,7 @@ private TransactionJson buildTriggerSmartContractTransaction(byte[] ownerAddress build.setCallTokenValue(args.callTokenValue) .setTokenId(args.tokenId) - .setCallValue(args.callValue); + .setCallValue(args.parseCallValue()); TransactionCapsule trxCap = wallet .createTransactionCapsule(build.build(), ContractType.TriggerSmartContract); From 286744bd40c19d353c1f6910e64a94da8c77e0d7 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 14 Jul 2021 22:49:39 +0800 Subject: [PATCH 070/341] feat: move exception --- .../tron/core/exception}/JsonRpcInternalError.java | 2 +- .../tron/core/exception}/JsonRpcInvalidParams.java | 2 +- .../tron/core/exception}/JsonRpcInvalidRequest.java | 2 +- framework/src/main/java/org/tron/core/Wallet.java | 2 +- .../tron/core/services/jsonrpc/BuildArguments.java | 2 ++ .../tron/core/services/jsonrpc/JsonRpcApiUtil.java | 11 +---------- .../org/tron/core/services/jsonrpc/TronJsonRpc.java | 3 +++ .../tron/core/services/jsonrpc/TronJsonRpcImpl.java | 7 +++++-- 8 files changed, 15 insertions(+), 16 deletions(-) rename {framework/src/main/java/org/tron/core/services/jsonrpc => common/src/main/java/org/tron/core/exception}/JsonRpcInternalError.java (87%) rename {framework/src/main/java/org/tron/core/services/jsonrpc => common/src/main/java/org/tron/core/exception}/JsonRpcInvalidParams.java (76%) rename {framework/src/main/java/org/tron/core/services/jsonrpc => common/src/main/java/org/tron/core/exception}/JsonRpcInvalidRequest.java (87%) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcInternalError.java b/common/src/main/java/org/tron/core/exception/JsonRpcInternalError.java similarity index 87% rename from framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcInternalError.java rename to common/src/main/java/org/tron/core/exception/JsonRpcInternalError.java index 1d9af3c1f4f..b3407fa641e 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcInternalError.java +++ b/common/src/main/java/org/tron/core/exception/JsonRpcInternalError.java @@ -1,4 +1,4 @@ -package org.tron.core.services.jsonrpc; +package org.tron.core.exception; public class JsonRpcInternalError extends RuntimeException { diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcInvalidParams.java b/common/src/main/java/org/tron/core/exception/JsonRpcInvalidParams.java similarity index 76% rename from framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcInvalidParams.java rename to common/src/main/java/org/tron/core/exception/JsonRpcInvalidParams.java index 675dee358ec..ed61c2aa501 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcInvalidParams.java +++ b/common/src/main/java/org/tron/core/exception/JsonRpcInvalidParams.java @@ -1,4 +1,4 @@ -package org.tron.core.services.jsonrpc; +package org.tron.core.exception; public class JsonRpcInvalidParams extends RuntimeException { diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcInvalidRequest.java b/common/src/main/java/org/tron/core/exception/JsonRpcInvalidRequest.java similarity index 87% rename from framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcInvalidRequest.java rename to common/src/main/java/org/tron/core/exception/JsonRpcInvalidRequest.java index 6c94a718685..412e62bc8b1 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcInvalidRequest.java +++ b/common/src/main/java/org/tron/core/exception/JsonRpcInvalidRequest.java @@ -1,4 +1,4 @@ -package org.tron.core.services.jsonrpc; +package org.tron.core.exception; public class JsonRpcInvalidRequest extends RuntimeException { diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index c36aaeb2d83..37898458c9f 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -158,6 +158,7 @@ import org.tron.core.exception.DupTransactionException; import org.tron.core.exception.HeaderNotFound; import org.tron.core.exception.ItemNotFoundException; +import org.tron.core.exception.JsonRpcInvalidParams; import org.tron.core.exception.NonUniqueObjectException; import org.tron.core.exception.PermissionException; import org.tron.core.exception.SignatureFormatException; @@ -171,7 +172,6 @@ import org.tron.core.net.TronNetDelegate; import org.tron.core.net.TronNetService; import org.tron.core.net.message.TransactionMessage; -import org.tron.core.services.jsonrpc.JsonRpcInvalidParams; import org.tron.core.store.AccountIdIndexStore; import org.tron.core.store.AccountStore; import org.tron.core.store.AccountTraceStore; diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java b/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java index 7d031d89afe..76e51d58b9c 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java @@ -10,6 +10,8 @@ import org.tron.api.GrpcAPI.BytesMessage; import org.tron.common.utils.ByteArray; import org.tron.core.Wallet; +import org.tron.core.exception.JsonRpcInvalidParams; +import org.tron.core.exception.JsonRpcInvalidRequest; import org.tron.protos.Protocol.Transaction.Contract.ContractType; import org.tron.protos.contract.SmartContractOuterClass.SmartContract; diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index 1ec68bf57f4..eadfc0fa36c 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -22,6 +22,7 @@ import org.tron.common.utils.StringUtil; import org.tron.core.Wallet; import org.tron.core.capsule.ContractCapsule; +import org.tron.core.exception.JsonRpcInvalidParams; import org.tron.core.exception.TronException; import org.tron.protos.Protocol.Block; import org.tron.protos.Protocol.Transaction; @@ -52,8 +53,6 @@ @Slf4j(topic = "API") public class JsonRpcApiUtil { - public static String balanceOfTopic = getMethodSign("balanceOf(address)"); - // transform the Tron address to Ethereum Address public static String tronToEthAddress(String tronAddress) { byte[] tronBytes = Commons.decodeFromBase58Check(tronAddress); @@ -130,9 +129,6 @@ public static byte[] convertToTronAddress(byte[] address) { return newAddress; } - /** - * 把byte数组转换为base58编码 - */ public static String encode58Check(byte[] input) { if (input == null || input.length == 0) { return ""; @@ -309,9 +305,6 @@ public static long getTransactionAmount(Transaction.Contract contract, String ha return amount; } - /** - * 获取交易的 amount - */ public static long getTransactionAmount(Transaction.Contract contract, String hash, long blockNum, TransactionInfo transactionInfo, Wallet wallet) { long amount = 0; @@ -342,7 +335,6 @@ public static long getTransactionAmount(Transaction.Contract contract, String ha case ParticipateAssetIssueContract: // long token = DataImporter.getTokenID(blockNum, // contractParameter.unpack(ParticipateAssetIssueContract.class).getAssetName()); - // //获取token的比例,计算出10币的数量 // long trxNum = contractParameter.unpack(ParticipateAssetIssueContract.class) // .getAmount(); // Token10Entity entity = DataImporter.getTokenEntity(token); @@ -371,7 +363,6 @@ public static long getTransactionAmount(Transaction.Contract contract, String ha case ShieldedTransferContract: ShieldedTransferContract shieldedTransferContract = contract.getParameter() .unpack(ShieldedTransferContract.class); - //from_amount 和 to_amount 不可能同时大于0 if (shieldedTransferContract.getFromAmount() > 0L) { amount = shieldedTransferContract.getFromAmount(); } else if (shieldedTransferContract.getToAmount() > 0L) { diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 5756bee1375..30f04ed5507 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -12,6 +12,9 @@ import lombok.Value; import org.springframework.stereotype.Component; import org.tron.core.exception.ItemNotFoundException; +import org.tron.core.exception.JsonRpcInternalError; +import org.tron.core.exception.JsonRpcInvalidParams; +import org.tron.core.exception.JsonRpcInvalidRequest; @Component public interface TronJsonRpc { diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 843f5dcb220..37c8cd3c3ed 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -33,6 +33,9 @@ import org.tron.core.capsule.TransactionCapsule; import org.tron.core.db.Manager; import org.tron.core.exception.ContractValidateException; +import org.tron.core.exception.JsonRpcInternalError; +import org.tron.core.exception.JsonRpcInvalidParams; +import org.tron.core.exception.JsonRpcInvalidRequest; import org.tron.core.exception.VMIllegalException; import org.tron.core.services.NodeInfoService; import org.tron.core.services.http.JsonFormat; @@ -672,7 +675,7 @@ private TransactionJson buildCreateSmartContractTransaction(byte[] ownerAddress, transactionJson.transaction = JSON.parseObject(Util.printCreateTransaction(tx, false)); return transactionJson; - } catch(ContractValidateException e) { + } catch (ContractValidateException e) { throw new JsonRpcInvalidRequest(e.getMessage()); } catch (Exception e) { throw new JsonRpcInternalError(e.getMessage()); @@ -705,7 +708,7 @@ private TransactionJson buildTransferContractTransaction(byte[] ownerAddress, transactionJson.transaction = JSON.parseObject(jsonString); return transactionJson; - } catch(ContractValidateException e) { + } catch (ContractValidateException e) { throw new JsonRpcInvalidRequest(e.getMessage()); } catch (Exception e) { throw new JsonRpcInternalError(e.getMessage()); From 1357bbd09ddb6032e93ed9e17549379f83b19c56 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 15 Jul 2021 11:17:53 +0800 Subject: [PATCH 071/341] typo --- framework/build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/framework/build.gradle b/framework/build.gradle index aec01c6aab0..deda80f27d7 100644 --- a/framework/build.gradle +++ b/framework/build.gradle @@ -79,7 +79,6 @@ dependencies { compile group: 'org.apache.httpcomponents', name: 'httpasyncclient', version: '4.1.1' // end http -// implementation('com.github.briandilley.jsonrpc4j:jsonrpc4j:1.6') // https://mvnrepository.com/artifact/com.github.briandilley.jsonrpc4j/jsonrpc4j compile group: 'com.github.briandilley.jsonrpc4j', name: 'jsonrpc4j', version: '1.6' From ec18bda26c2b76ac5f66c7db987a623b41113f42 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 15 Jul 2021 12:33:29 +0800 Subject: [PATCH 072/341] feat: throw new Error if trigger contract exception instead of Result --- .../org/tron/core/services/jsonrpc/TronJsonRpcImpl.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 37c8cd3c3ed..074ba551c93 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -754,15 +754,14 @@ private TransactionJson buildTriggerSmartContractTransaction(byte[] ownerAddress trxExtBuilder.setTransaction(trx); retBuilder.setResult(true).setCode(response_code.SUCCESS); } catch (ContractValidateException e) { - retBuilder.setResult(false).setCode(response_code.CONTRACT_VALIDATE_ERROR) - .setMessage(ByteString.copyFromUtf8(e.getMessage())); + throw new JsonRpcInvalidRequest(e.getMessage()); } catch (Exception e) { - String errString = null; + String errString = "invalid json request"; if (e.getMessage() != null) { errString = e.getMessage().replaceAll("[\"]", "\'"); } - retBuilder.setResult(false).setCode(response_code.OTHER_ERROR) - .setMessage(ByteString.copyFromUtf8(e.getClass() + " : " + errString)); + + throw new JsonRpcInvalidRequest(errString); } trxExtBuilder.setResult(retBuilder); From 0f69947773440224554daabb04d3058ba7537651 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 15 Jul 2021 14:37:49 +0800 Subject: [PATCH 073/341] feat: return transaction except result --- .../org/tron/core/services/jsonrpc/TronJsonRpcImpl.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 074ba551c93..9e7ebda91af 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -752,7 +752,6 @@ private TransactionJson buildTriggerSmartContractTransaction(byte[] ownerAddress retBuilder); trx = setTransactionPermissionId(args.permissionId, trx); trxExtBuilder.setTransaction(trx); - retBuilder.setResult(true).setCode(response_code.SUCCESS); } catch (ContractValidateException e) { throw new JsonRpcInvalidRequest(e.getMessage()); } catch (Exception e) { @@ -761,12 +760,10 @@ private TransactionJson buildTriggerSmartContractTransaction(byte[] ownerAddress errString = e.getMessage().replaceAll("[\"]", "\'"); } - throw new JsonRpcInvalidRequest(errString); + throw new JsonRpcInternalError(errString); } - trxExtBuilder.setResult(retBuilder); - - String jsonString = Util.printTransactionExtention(trxExtBuilder.build(), args.visible); + String jsonString = Util.printTransaction(trxExtBuilder.build().getTransaction(), args.visible); TransactionJson transactionJson = new TransactionJson(); transactionJson.transaction = JSON.parseObject(jsonString); From cd99a348d2ecd52a58e77084761efc79b6a7cb69 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 15 Jul 2021 14:52:21 +0800 Subject: [PATCH 074/341] feat: set jsonRpcFullNodeEnable and jsonRpcSolidityEnable default to false --- .../main/java/org/tron/common/parameter/CommonParameter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/org/tron/common/parameter/CommonParameter.java b/common/src/main/java/org/tron/common/parameter/CommonParameter.java index f6fc5cc02b9..77b908a7f21 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -403,10 +403,10 @@ public class CommonParameter { public boolean solidityNodeHttpEnable = true; @Getter @Setter - public boolean fullNodeHttpJsonRpcEnable = true; + public boolean fullNodeHttpJsonRpcEnable = false; @Getter @Setter - public boolean solidityNodeHttpJsonRpcEnable = true; + public boolean solidityNodeHttpJsonRpcEnable = false; @Getter @Setter public boolean pBFTNodeHttpJsonRpcEnable = false; From d23310d6d293e5222a8320e5d2e0a1e50fbbbda2 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 15 Jul 2021 15:21:45 +0800 Subject: [PATCH 075/341] feat: add more error msg --- .../java/org/tron/core/services/jsonrpc/BuildArguments.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java b/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java index 76e51d58b9c..14e34e1a1c1 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java @@ -80,7 +80,7 @@ public long parseCallValue() { try { callValue = ByteArray.jsonHexToLong(value); } catch (Exception e) { - throw new JsonRpcInvalidParams("invalid hex number"); + throw new JsonRpcInvalidParams("invalid param value: invalid hex number"); } } From 0feb89974f63d4590be078cde89f9b3b0f9dc8f9 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 15 Jul 2021 16:47:44 +0800 Subject: [PATCH 076/341] feat: return default result in eth_getStorageAt --- .../core/services/jsonrpc/TronJsonRpcImpl.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 9e7ebda91af..cc62f28447a 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -58,6 +58,7 @@ public class TronJsonRpcImpl implements TronJsonRpc { String regexHash = "(0x)?[a-zA-Z0-9]{64}$"; + private final int chainId = 100; private NodeInfoService nodeInfoService; private Wallet wallet; @@ -203,7 +204,7 @@ public String getNetVersion() { @Override public String ethChainId() { - return ByteArray.toJsonHex(100); + return ByteArray.toJsonHex(chainId); } @Override @@ -328,7 +329,7 @@ public String getStorageAt(String address, String storageIdx, String blockNumOrT Storage storage = new Storage(addressByte, store); DataWord value = storage.getValue(new DataWord(ByteArray.fromHexString(storageIdx))); - return value == null ? null : ByteArray.toJsonHex(value.getData()); + return ByteArray.toJsonHex(value == null ? new byte[32] : value.getData()); } else { try { ByteArray.hexToBigInteger(blockNumOrTag); @@ -374,21 +375,19 @@ public String getCoinbase() { byte[] witnessAddress = wallet.getNowBlock().getBlockHeader().getRawData().getWitnessAddress() .toByteArray(); if (witnessAddress == null || witnessAddress.length != 21) { - throw new JsonRpcInvalidParams("invalid witness address"); + throw new JsonRpcInternalError("invalid witness address"); } return ByteArray.toJsonHexAddress(witnessAddress); } + // return energy fee @Override public String gasPrice() { BigInteger gasPrice; - BigInteger multiplier = new BigInteger("1000000000", 10); // Gwei: 10^9 + // 1sun as 1 Gwei(1 eth = 10^9Gwei), return wei(1 eth=10^18 wei), so 1 sun as 10^9 wei + BigInteger multiplier = new BigInteger("1000000000", 10); - if ("getTransactionFee".equals(wallet.getChainParameters().getChainParameter(3).getKey())) { - gasPrice = BigInteger.valueOf(wallet.getChainParameters().getChainParameter(3).getValue()); - } else { - gasPrice = BigInteger.valueOf(140); - } + gasPrice = BigInteger.valueOf(wallet.getEnergyFee()); return "0x" + gasPrice.multiply(multiplier).toString(16); } From 25e9a1185a494bc93f5647773b8168bd3931c7de Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 15 Jul 2021 18:16:20 +0800 Subject: [PATCH 077/341] feat: set cumulativeGasUsed and gasUsed to null in the result of eth_getTransactionReceipt --- .../services/jsonrpc/TransactionReceipt.java | 18 +++--------------- .../core/services/jsonrpc/TronJsonRpc.java | 7 +++++-- .../core/services/jsonrpc/TronJsonRpcImpl.java | 9 +++++---- 3 files changed, 13 insertions(+), 21 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java index d453b7f6c9c..ad8db426049 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java @@ -57,29 +57,15 @@ public TransactionReceipt(Protocol.Block block, TransactionInfo txInfo, Wallet w String txid = ByteArray.toHexString(txInfo.getId().toByteArray()); Protocol.Transaction transaction = null; - long cumulativeGas = 0; long cumulativeLogCount = 0; - long sunPerEnergy = Constant.SUN_PER_ENERGY; - long dynamicEnergyFee = wallet.getEnergyFee(); - if (dynamicEnergyFee > 0) { - sunPerEnergy = dynamicEnergyFee; - } - TransactionInfoList infoList = wallet.getTransactionInfoByBlockNum(blockCapsule.getNum()); for (int index = 0; index < infoList.getTransactionInfoCount(); index++) { TransactionInfo info = infoList.getTransactionInfo(index); ResourceReceipt resourceReceipt = info.getReceipt(); - long energyUsage = resourceReceipt.getEnergyUsage() - + resourceReceipt.getOriginEnergyUsage() - + resourceReceipt.getEnergyFee() / sunPerEnergy; - cumulativeGas += energyUsage; - if (ByteArray.toHexString(info.getId().toByteArray()).equals(txid)) { transactionIndex = ByteArray.toJsonHex(index); - cumulativeGasUsed = ByteArray.toJsonHex(cumulativeGas); - gasUsed = ByteArray.toJsonHex(energyUsage); status = resourceReceipt.getResultValue() == 1 ? "0x1" : "0x0"; transaction = block.getTransactions(index); @@ -89,6 +75,8 @@ public TransactionReceipt(Protocol.Block block, TransactionInfo txInfo, Wallet w } } + cumulativeGasUsed = null; + gasUsed = null; blockHash = ByteArray.toJsonHex(blockCapsule.getBlockId().getBytes()); blockNumber = ByteArray.toJsonHex(blockCapsule.getNum()); transactionHash = ByteArray.toJsonHex(txInfo.getId().toByteArray()); @@ -129,9 +117,9 @@ public TransactionReceipt(Protocol.Block block, TransactionInfo txInfo, Wallet w logList.add(transactionLog); } + logs = logList.toArray(new TransactionReceipt.TransactionLog[logList.size()]); logsBloom = null; // no value - root = null; } } \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 30f04ed5507..087524895e6 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -203,6 +203,9 @@ class TransactionJson { String getStorageAt(String address, String storageIdx, String blockNumOrTag); @JsonRpcMethod("eth_getTransactionCount") + @JsonRpcErrors({ + @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), + }) String getSendTransactionCountOfAddress(String address, String blockNumOrTag); @JsonRpcMethod("eth_getCode") @@ -284,10 +287,10 @@ class TransactionJson { Object getSyncingStatus(); @JsonRpcMethod("eth_getUncleByBlockHashAndIndex") - BlockResult getUncleByBlockHashAndIndex(String blockHash, int index); + BlockResult getUncleByBlockHashAndIndex(String blockHash, String index); @JsonRpcMethod("eth_getUncleByBlockNumberAndIndex") - BlockResult getUncleByBlockNumberAndIndex(String blockNumOrTag, int index); + BlockResult getUncleByBlockNumberAndIndex(String blockNumOrTag, String index); @JsonRpcMethod("eth_getUncleCountByBlockHash") String getUncleCountByBlockHash(String blockHash); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index cc62f28447a..05e29c47001 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -59,6 +59,7 @@ public class TronJsonRpcImpl implements TronJsonRpc { String regexHash = "(0x)?[a-zA-Z0-9]{64}$"; private final int chainId = 100; + private final int networkId = 100; private NodeInfoService nodeInfoService; private Wallet wallet; @@ -198,8 +199,8 @@ private BlockResult getBlockResult(Block block, boolean fullTx) { @Override public String getNetVersion() { - //network id - return ByteArray.toJsonHex(100); + // network id + return ByteArray.toJsonHex(networkId); } @Override @@ -571,12 +572,12 @@ public Object getSyncingStatus() { } @Override - public BlockResult getUncleByBlockHashAndIndex(String blockHash, int index) { + public BlockResult getUncleByBlockHashAndIndex(String blockHash, String index) { return null; } @Override - public BlockResult getUncleByBlockNumberAndIndex(String blockNumOrTag, int index) { + public BlockResult getUncleByBlockNumberAndIndex(String blockNumOrTag, String index) { return null; } From f473629d48203b5d82b7f6e50a053eac4a1cb2f0 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Fri, 16 Jul 2021 11:26:35 +0800 Subject: [PATCH 078/341] refactor: exception extends TronException --- .../core/exception/JsonRpcInternalError.java | 16 --- .../exception/JsonRpcInternalException.java | 16 +++ .../core/exception/JsonRpcInvalidParams.java | 8 -- .../JsonRpcInvalidParamsException.java | 16 +++ .../core/exception/JsonRpcInvalidRequest.java | 16 --- .../JsonRpcInvalidRequestException.java | 16 +++ .../src/main/java/org/tron/core/Wallet.java | 9 +- .../core/services/jsonrpc/BuildArguments.java | 16 +-- .../core/services/jsonrpc/JsonRpcApiUtil.java | 8 +- .../core/services/jsonrpc/TronJsonRpc.java | 84 +++++++------ .../services/jsonrpc/TronJsonRpcImpl.java | 119 ++++++++++-------- 11 files changed, 182 insertions(+), 142 deletions(-) delete mode 100644 common/src/main/java/org/tron/core/exception/JsonRpcInternalError.java create mode 100644 common/src/main/java/org/tron/core/exception/JsonRpcInternalException.java delete mode 100644 common/src/main/java/org/tron/core/exception/JsonRpcInvalidParams.java create mode 100644 common/src/main/java/org/tron/core/exception/JsonRpcInvalidParamsException.java delete mode 100644 common/src/main/java/org/tron/core/exception/JsonRpcInvalidRequest.java create mode 100644 common/src/main/java/org/tron/core/exception/JsonRpcInvalidRequestException.java diff --git a/common/src/main/java/org/tron/core/exception/JsonRpcInternalError.java b/common/src/main/java/org/tron/core/exception/JsonRpcInternalError.java deleted file mode 100644 index b3407fa641e..00000000000 --- a/common/src/main/java/org/tron/core/exception/JsonRpcInternalError.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.tron.core.exception; - -public class JsonRpcInternalError extends RuntimeException { - - public JsonRpcInternalError() { - super(); - } - - public JsonRpcInternalError(String message) { - super(message); - } - - public JsonRpcInternalError(String message, Throwable cause) { - super(message, cause); - } -} \ No newline at end of file diff --git a/common/src/main/java/org/tron/core/exception/JsonRpcInternalException.java b/common/src/main/java/org/tron/core/exception/JsonRpcInternalException.java new file mode 100644 index 00000000000..12310e67747 --- /dev/null +++ b/common/src/main/java/org/tron/core/exception/JsonRpcInternalException.java @@ -0,0 +1,16 @@ +package org.tron.core.exception; + +public class JsonRpcInternalException extends TronException { + + public JsonRpcInternalException() { + super(); + } + + public JsonRpcInternalException(String message) { + super(message); + } + + public JsonRpcInternalException(String message, Throwable cause) { + super(message, cause); + } +} \ No newline at end of file diff --git a/common/src/main/java/org/tron/core/exception/JsonRpcInvalidParams.java b/common/src/main/java/org/tron/core/exception/JsonRpcInvalidParams.java deleted file mode 100644 index ed61c2aa501..00000000000 --- a/common/src/main/java/org/tron/core/exception/JsonRpcInvalidParams.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.tron.core.exception; - -public class JsonRpcInvalidParams extends RuntimeException { - - public JsonRpcInvalidParams(String msg) { - super(msg); - } -} \ No newline at end of file diff --git a/common/src/main/java/org/tron/core/exception/JsonRpcInvalidParamsException.java b/common/src/main/java/org/tron/core/exception/JsonRpcInvalidParamsException.java new file mode 100644 index 00000000000..adf205a309a --- /dev/null +++ b/common/src/main/java/org/tron/core/exception/JsonRpcInvalidParamsException.java @@ -0,0 +1,16 @@ +package org.tron.core.exception; + +public class JsonRpcInvalidParamsException extends TronException { + + public JsonRpcInvalidParamsException() { + super(); + } + + public JsonRpcInvalidParamsException(String msg) { + super(msg); + } + + public JsonRpcInvalidParamsException(String message, Throwable cause) { + super(message, cause); + } +} \ No newline at end of file diff --git a/common/src/main/java/org/tron/core/exception/JsonRpcInvalidRequest.java b/common/src/main/java/org/tron/core/exception/JsonRpcInvalidRequest.java deleted file mode 100644 index 412e62bc8b1..00000000000 --- a/common/src/main/java/org/tron/core/exception/JsonRpcInvalidRequest.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.tron.core.exception; - -public class JsonRpcInvalidRequest extends RuntimeException { - - public JsonRpcInvalidRequest() { - super(); - } - - public JsonRpcInvalidRequest(String message) { - super(message); - } - - public JsonRpcInvalidRequest(String message, Throwable cause) { - super(message, cause); - } -} \ No newline at end of file diff --git a/common/src/main/java/org/tron/core/exception/JsonRpcInvalidRequestException.java b/common/src/main/java/org/tron/core/exception/JsonRpcInvalidRequestException.java new file mode 100644 index 00000000000..2689bff0cd2 --- /dev/null +++ b/common/src/main/java/org/tron/core/exception/JsonRpcInvalidRequestException.java @@ -0,0 +1,16 @@ +package org.tron.core.exception; + +public class JsonRpcInvalidRequestException extends TronException { + + public JsonRpcInvalidRequestException() { + super(); + } + + public JsonRpcInvalidRequestException(String message) { + super(message); + } + + public JsonRpcInvalidRequestException(String message, Throwable cause) { + super(message, cause); + } +} \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index 37898458c9f..8c0a0144fb9 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -158,7 +158,7 @@ import org.tron.core.exception.DupTransactionException; import org.tron.core.exception.HeaderNotFound; import org.tron.core.exception.ItemNotFoundException; -import org.tron.core.exception.JsonRpcInvalidParams; +import org.tron.core.exception.JsonRpcInvalidParamsException; import org.tron.core.exception.NonUniqueObjectException; import org.tron.core.exception.PermissionException; import org.tron.core.exception.SignatureFormatException; @@ -663,7 +663,7 @@ public long getTransactionCountByBlockNum(long blockNum) { return count; } - public Block getByJsonBlockId(String id) { + public Block getByJsonBlockId(String id) throws JsonRpcInvalidParamsException { if ("earliest".equalsIgnoreCase(id)) { return getBlockByNum(0); } else if ("latest".equalsIgnoreCase(id)) { @@ -675,14 +675,15 @@ public Block getByJsonBlockId(String id) { try { blockNumber = ByteArray.hexToBigInteger(id).longValue(); } catch (Exception e) { - throw new JsonRpcInvalidParams("invalid block number"); + throw new JsonRpcInvalidParamsException("invalid block number"); } return getBlockByNum(blockNumber); } } - public List getTransactionsByJsonBlockId(String id) { + public List getTransactionsByJsonBlockId(String id) + throws JsonRpcInvalidParamsException { if ("pending".equalsIgnoreCase(id)) { return null; } else { diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java b/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java index 14e34e1a1c1..f7676bf82e4 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java @@ -10,8 +10,8 @@ import org.tron.api.GrpcAPI.BytesMessage; import org.tron.common.utils.ByteArray; import org.tron.core.Wallet; -import org.tron.core.exception.JsonRpcInvalidParams; -import org.tron.core.exception.JsonRpcInvalidRequest; +import org.tron.core.exception.JsonRpcInvalidParamsException; +import org.tron.core.exception.JsonRpcInvalidRequestException; import org.tron.protos.Protocol.Transaction.Contract.ContractType; import org.tron.protos.contract.SmartContractOuterClass.SmartContract; @@ -19,6 +19,7 @@ @AllArgsConstructor @ToString public class BuildArguments { + public String from; public String to; public String gas; //not used @@ -41,14 +42,15 @@ public class BuildArguments { public boolean visible = false; - public ContractType getContractType(Wallet wallet) { + public ContractType getContractType(Wallet wallet) throws JsonRpcInvalidRequestException, + JsonRpcInvalidParamsException { ContractType contractType; // to is null if (StringUtils.isEmpty(to) || to.equals("0x")) { // data is null if (StringUtils.isEmpty(data) || data.equals("0x")) { - throw new JsonRpcInvalidRequest("invalid json request"); + throw new JsonRpcInvalidRequestException("invalid json request"); } contractType = ContractType.CreateSmartContract; @@ -64,7 +66,7 @@ public ContractType getContractType(Wallet wallet) { contractType = ContractType.TriggerSmartContract; } else { if (StringUtils.isEmpty(value)) { - throw new JsonRpcInvalidRequest("invalid json request"); + throw new JsonRpcInvalidRequestException("invalid json request"); } contractType = ContractType.TransferContract; } @@ -73,14 +75,14 @@ public ContractType getContractType(Wallet wallet) { return contractType; } - public long parseCallValue() { + public long parseCallValue() throws JsonRpcInvalidParamsException { long callValue = 0L; if (StringUtils.isNotEmpty(value)) { try { callValue = ByteArray.jsonHexToLong(value); } catch (Exception e) { - throw new JsonRpcInvalidParams("invalid param value: invalid hex number"); + throw new JsonRpcInvalidParamsException("invalid param value: invalid hex number"); } } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index eadfc0fa36c..946c55c98e0 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -22,7 +22,7 @@ import org.tron.common.utils.StringUtil; import org.tron.core.Wallet; import org.tron.core.capsule.ContractCapsule; -import org.tron.core.exception.JsonRpcInvalidParams; +import org.tron.core.exception.JsonRpcInvalidParamsException; import org.tron.core.exception.TronException; import org.tron.protos.Protocol.Block; import org.tron.protos.Protocol.Transaction; @@ -473,20 +473,20 @@ public static long calEngergyFee(long blockNum, Wallet wallet) { } } - public static byte[] addressHashToByteArray(String hash) { + public static byte[] addressHashToByteArray(String hash) throws JsonRpcInvalidParamsException { byte[] bHash; try { bHash = ByteArray.fromHexString(hash); if (bHash.length != DecodeUtil.ADDRESS_SIZE / 2 && bHash.length != DecodeUtil.ADDRESS_SIZE / 2 - 1) { - throw new JsonRpcInvalidParams("invalid address hash value"); + throw new JsonRpcInvalidParamsException("invalid address hash value"); } if (bHash.length == DecodeUtil.ADDRESS_SIZE / 2 - 1) { bHash = ByteUtil.merge(new byte[] {DecodeUtil.addressPreFixByte}, bHash); } } catch (Exception e) { - throw new JsonRpcInvalidParams(e.getMessage()); + throw new JsonRpcInvalidParamsException(e.getMessage()); } return bHash; } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 087524895e6..ae0aa3ef34e 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -12,9 +12,9 @@ import lombok.Value; import org.springframework.stereotype.Component; import org.tron.core.exception.ItemNotFoundException; -import org.tron.core.exception.JsonRpcInternalError; -import org.tron.core.exception.JsonRpcInvalidParams; -import org.tron.core.exception.JsonRpcInvalidRequest; +import org.tron.core.exception.JsonRpcInternalException; +import org.tron.core.exception.JsonRpcInvalidParamsException; +import org.tron.core.exception.JsonRpcInvalidRequestException; @Component public interface TronJsonRpc { @@ -80,6 +80,7 @@ public String toString() { @NoArgsConstructor @AllArgsConstructor class CallArguments { + public String from; public String to; public String gas; //not used @@ -103,6 +104,7 @@ public String toString() { } class CompilationResult { + public String code; public CompilationInfo info; @@ -116,6 +118,7 @@ public String toString() { } class CompilationInfo { + public String source; public String language; public String languageVersion; @@ -139,6 +142,7 @@ public String toString() { } class TransactionJson { + public JSONObject transaction; } @@ -147,33 +151,35 @@ class TransactionJson { @JsonRpcMethod("web3_sha3") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcInvalidParams.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), }) - String web3Sha3(String data) throws Exception; + String web3Sha3(String data) throws JsonRpcInvalidParamsException; @JsonRpcMethod("eth_getBlockTransactionCountByHash") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcInvalidParams.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), }) - String ethGetBlockTransactionCountByHash(String blockHash) throws Exception; + String ethGetBlockTransactionCountByHash(String blockHash) throws JsonRpcInvalidParamsException; @JsonRpcMethod("eth_getBlockTransactionCountByNumber") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcInvalidParams.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), }) - String ethGetBlockTransactionCountByNumber(String bnOrId) throws Exception; + String ethGetBlockTransactionCountByNumber(String bnOrId) throws JsonRpcInvalidParamsException; @JsonRpcMethod("eth_getBlockByHash") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcInvalidParams.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), }) - BlockResult ethGetBlockByHash(String blockHash, Boolean fullTransactionObjects) throws Exception; + BlockResult ethGetBlockByHash(String blockHash, Boolean fullTransactionObjects) + throws JsonRpcInvalidParamsException; @JsonRpcMethod("eth_getBlockByNumber") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcInvalidParams.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), }) - BlockResult ethGetBlockByNumber(String bnOrId, Boolean fullTransactionObjects) throws Exception; + BlockResult ethGetBlockByNumber(String bnOrId, Boolean fullTransactionObjects) + throws JsonRpcInvalidParamsException; @JsonRpcMethod("net_version") String getNetVersion(); @@ -192,15 +198,17 @@ class TransactionJson { @JsonRpcMethod("eth_getBalance") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcInvalidParams.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), }) - String getTrxBalance(String address, String blockNumOrTag) throws ItemNotFoundException; + String getTrxBalance(String address, String blockNumOrTag) throws ItemNotFoundException, + JsonRpcInvalidParamsException; @JsonRpcMethod("eth_getStorageAt") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcInvalidParams.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), }) - String getStorageAt(String address, String storageIdx, String blockNumOrTag); + String getStorageAt(String address, String storageIdx, String blockNumOrTag) + throws JsonRpcInvalidParamsException; @JsonRpcMethod("eth_getTransactionCount") @JsonRpcErrors({ @@ -210,15 +218,16 @@ class TransactionJson { @JsonRpcMethod("eth_getCode") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcInvalidParams.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), }) - String getABIofSmartContract(String contractAddress, String bnOrId); + String getABIofSmartContract(String contractAddress, String bnOrId) + throws JsonRpcInvalidParamsException; @JsonRpcMethod("eth_coinbase") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcInvalidParams.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), }) - String getCoinbase() throws Exception; + String getCoinbase() throws JsonRpcInternalException; @JsonRpcMethod("eth_gasPrice") String gasPrice(); @@ -252,33 +261,36 @@ class TransactionJson { @JsonRpcMethod("eth_getTransactionByHash") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcInvalidParams.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), }) - TransactionResult getTransactionByHash(String txid); + TransactionResult getTransactionByHash(String txid) throws JsonRpcInvalidParamsException; @JsonRpcMethod("eth_getTransactionByBlockHashAndIndex") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcInvalidParams.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), }) - TransactionResult getTransactionByBlockHashAndIndex(String blockHash, String index); + TransactionResult getTransactionByBlockHashAndIndex(String blockHash, String index) + throws JsonRpcInvalidParamsException; @JsonRpcMethod("eth_getTransactionByBlockNumberAndIndex") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcInvalidParams.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), }) - TransactionResult getTransactionByBlockNumberAndIndex(String blockNumOrTag, String index); + TransactionResult getTransactionByBlockNumberAndIndex(String blockNumOrTag, String index) + throws JsonRpcInvalidParamsException; @JsonRpcMethod("eth_getTransactionReceipt") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcInvalidParams.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), }) - TransactionReceipt getTransactionReceipt(String txid); + TransactionReceipt getTransactionReceipt(String txid) throws JsonRpcInvalidParamsException; @JsonRpcMethod("eth_call") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcInvalidParams.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), }) - String getCall(CallArguments transactionCall, String blockNumOrTag); + String getCall(CallArguments transactionCall, String blockNumOrTag) + throws JsonRpcInvalidParamsException; @JsonRpcMethod("net_peerCount") String getPeerCount(); @@ -312,11 +324,13 @@ class TransactionJson { @JsonRpcMethod("buildTransaction") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcInvalidRequest.class, code = -32600, data = "{}"), - @JsonRpcError(exception = JsonRpcInvalidParams.class, code = -32602, data = "{}"), - @JsonRpcError(exception = JsonRpcInternalError.class, code = -32603, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidRequestException.class, code = -32600, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInternalException.class, code = -32603, data = "{}"), }) - TransactionJson buildTransaction(BuildArguments args); + TransactionJson buildTransaction(BuildArguments args) + throws JsonRpcInvalidParamsException, JsonRpcInvalidRequestException, + JsonRpcInternalException; // not supported @JsonRpcMethod("eth_submitWork") diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 05e29c47001..f4ec7fd1e47 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -33,9 +33,9 @@ import org.tron.core.capsule.TransactionCapsule; import org.tron.core.db.Manager; import org.tron.core.exception.ContractValidateException; -import org.tron.core.exception.JsonRpcInternalError; -import org.tron.core.exception.JsonRpcInvalidParams; -import org.tron.core.exception.JsonRpcInvalidRequest; +import org.tron.core.exception.JsonRpcInternalException; +import org.tron.core.exception.JsonRpcInvalidParamsException; +import org.tron.core.exception.JsonRpcInvalidRequestException; import org.tron.core.exception.VMIllegalException; import org.tron.core.services.NodeInfoService; import org.tron.core.services.http.JsonFormat; @@ -86,12 +86,12 @@ public String web3ClientVersion() { } @Override - public String web3Sha3(String data) { + public String web3Sha3(String data) throws JsonRpcInvalidParamsException { byte[] input; try { input = ByteArray.fromHexString(data); } catch (Exception e) { - throw new JsonRpcInvalidParams("invalid input value"); + throw new JsonRpcInvalidParamsException("invalid input value"); } byte[] result = Hash.sha3(input); @@ -99,7 +99,8 @@ public String web3Sha3(String data) { } @Override - public String ethGetBlockTransactionCountByHash(String blockHash) throws Exception { + public String ethGetBlockTransactionCountByHash(String blockHash) + throws JsonRpcInvalidParamsException { Block b = getBlockByJsonHash(blockHash); if (b == null) { return null; @@ -110,7 +111,8 @@ public String ethGetBlockTransactionCountByHash(String blockHash) throws Excepti } @Override - public String ethGetBlockTransactionCountByNumber(String blockNumOrTag) throws Exception { + public String ethGetBlockTransactionCountByNumber(String blockNumOrTag) + throws JsonRpcInvalidParamsException { List list = wallet.getTransactionsByJsonBlockId(blockNumOrTag); if (list == null) { return null; @@ -122,32 +124,33 @@ public String ethGetBlockTransactionCountByNumber(String blockNumOrTag) throws E @Override public BlockResult ethGetBlockByHash(String blockHash, Boolean fullTransactionObjects) - throws Exception { + throws JsonRpcInvalidParamsException { final Block b = getBlockByJsonHash(blockHash); return getBlockResult(b, fullTransactionObjects); } @Override - public BlockResult ethGetBlockByNumber(String blockNumOrTag, Boolean fullTransactionObjects) { + public BlockResult ethGetBlockByNumber(String blockNumOrTag, Boolean fullTransactionObjects) + throws JsonRpcInvalidParamsException { final Block b = wallet.getByJsonBlockId(blockNumOrTag); return (b == null ? null : getBlockResult(b, fullTransactionObjects)); } - private byte[] hashToByteArray(String hash) { + private byte[] hashToByteArray(String hash) throws JsonRpcInvalidParamsException { if (!Pattern.matches(regexHash, hash)) { - throw new JsonRpcInvalidParams("invalid hash value"); + throw new JsonRpcInvalidParamsException("invalid hash value"); } byte[] bHash; try { bHash = ByteArray.fromHexString(hash); } catch (Exception e) { - throw new JsonRpcInvalidParams(e.getMessage()); + throw new JsonRpcInvalidParamsException(e.getMessage()); } return bHash; } - private Block getBlockByJsonHash(String blockHash) { + private Block getBlockByJsonHash(String blockHash) throws JsonRpcInvalidParamsException { byte[] bHash = hashToByteArray(blockHash); return wallet.getBlockById(ByteString.copyFrom(bHash)); } @@ -225,10 +228,11 @@ public String getLatestBlockNum() { } @Override - public String getTrxBalance(String address, String blockNumOrTag) { + public String getTrxBalance(String address, String blockNumOrTag) + throws JsonRpcInvalidParamsException { if ("earliest".equalsIgnoreCase(blockNumOrTag) || "pending".equalsIgnoreCase(blockNumOrTag)) { - throw new JsonRpcInvalidParams("TAG [earliest | pending] not supported"); + throw new JsonRpcInvalidParamsException("TAG [earliest | pending] not supported"); } else if ("latest".equalsIgnoreCase(blockNumOrTag)) { byte[] addressData = addressHashToByteArray(address); @@ -244,16 +248,16 @@ public String getTrxBalance(String address, String blockNumOrTag) { try { ByteArray.hexToBigInteger(blockNumOrTag); } catch (Exception e) { - throw new JsonRpcInvalidParams("invalid block number"); + throw new JsonRpcInvalidParamsException("invalid block number"); } - throw new JsonRpcInvalidParams("QUANTITY not supported, just support TAG as latest"); + throw new JsonRpcInvalidParamsException("QUANTITY not supported, just support TAG as latest"); } } /** - * @param data Hash of the method signature and encoded parameters. - * for example: getMethodSign(methodName(uint256,uint256)) || data1 || data2 + * @param data Hash of the method signature and encoded parameters. for example: + * getMethodSign(methodName(uint256,uint256)) || data1 || data2 */ private String call(byte[] ownerAddressByte, byte[] contractAddressByte, byte[] data) { @@ -319,10 +323,11 @@ private String call(byte[] ownerAddressByte, byte[] contractAddressByte, byte[] } @Override - public String getStorageAt(String address, String storageIdx, String blockNumOrTag) { + public String getStorageAt(String address, String storageIdx, String blockNumOrTag) + throws JsonRpcInvalidParamsException { if ("earliest".equalsIgnoreCase(blockNumOrTag) || "pending".equalsIgnoreCase(blockNumOrTag)) { - throw new JsonRpcInvalidParams("TAG [earliest | pending] not supported"); + throw new JsonRpcInvalidParamsException("TAG [earliest | pending] not supported"); } else if ("latest".equalsIgnoreCase(blockNumOrTag)) { byte[] addressByte = addressHashToByteArray(address); @@ -335,18 +340,19 @@ public String getStorageAt(String address, String storageIdx, String blockNumOrT try { ByteArray.hexToBigInteger(blockNumOrTag); } catch (Exception e) { - throw new JsonRpcInvalidParams("invalid block number"); + throw new JsonRpcInvalidParamsException("invalid block number"); } - throw new JsonRpcInvalidParams("QUANTITY not supported, just support TAG as latest"); + throw new JsonRpcInvalidParamsException("QUANTITY not supported, just support TAG as latest"); } } @Override - public String getABIofSmartContract(String contractAddress, String blockNumOrTag) { + public String getABIofSmartContract(String contractAddress, String blockNumOrTag) + throws JsonRpcInvalidParamsException { if ("earliest".equalsIgnoreCase(blockNumOrTag) || "pending".equalsIgnoreCase(blockNumOrTag)) { - throw new JsonRpcInvalidParams("TAG [earliest | pending] not supported"); + throw new JsonRpcInvalidParamsException("TAG [earliest | pending] not supported"); } else if ("latest".equalsIgnoreCase(blockNumOrTag)) { byte[] addressData = addressHashToByteArray(contractAddress); @@ -364,19 +370,19 @@ public String getABIofSmartContract(String contractAddress, String blockNumOrTag try { ByteArray.hexToBigInteger(blockNumOrTag); } catch (Exception e) { - throw new JsonRpcInvalidParams("invalid block number"); + throw new JsonRpcInvalidParamsException("invalid block number"); } - throw new JsonRpcInvalidParams("QUANTITY not supported, just support TAG as latest"); + throw new JsonRpcInvalidParamsException("QUANTITY not supported, just support TAG as latest"); } } @Override - public String getCoinbase() { + public String getCoinbase() throws JsonRpcInternalException { byte[] witnessAddress = wallet.getNowBlock().getBlockHeader().getRawData().getWitnessAddress() .toByteArray(); if (witnessAddress == null || witnessAddress.length != 21) { - throw new JsonRpcInternalError("invalid witness address"); + throw new JsonRpcInternalException("invalid witness address"); } return ByteArray.toJsonHexAddress(witnessAddress); } @@ -429,7 +435,7 @@ public CompilationResult ethCompileSerpent(String contract) { } @Override - public TransactionResult getTransactionByHash(String txid) { + public TransactionResult getTransactionByHash(String txid) throws JsonRpcInvalidParamsException { byte[] txHash = hashToByteArray(txid); TransactionInfo transactionInfo = wallet @@ -469,12 +475,13 @@ private TransactionResult formatRpcTransaction(TransactionInfo transactioninfo, return new TransactionResult(block, transactionIndex, transaction, wallet); } - public TransactionResult getTransactionByBlockAndIndex(Block block, String index) { + public TransactionResult getTransactionByBlockAndIndex(Block block, String index) + throws JsonRpcInvalidParamsException { int txIndex; try { txIndex = ByteArray.jsonHexToInt(index); } catch (Exception e) { - throw new JsonRpcInvalidParams("invalid index value"); + throw new JsonRpcInvalidParamsException("invalid index value"); } if (txIndex >= block.getTransactionsCount()) { @@ -485,7 +492,8 @@ public TransactionResult getTransactionByBlockAndIndex(Block block, String index } @Override - public TransactionResult getTransactionByBlockHashAndIndex(String blockHash, String index) { + public TransactionResult getTransactionByBlockHashAndIndex(String blockHash, String index) + throws JsonRpcInvalidParamsException { final Block block = getBlockByJsonHash(blockHash); if (block == null) { @@ -496,7 +504,8 @@ public TransactionResult getTransactionByBlockHashAndIndex(String blockHash, Str } @Override - public TransactionResult getTransactionByBlockNumberAndIndex(String blockNumOrTag, String index) { + public TransactionResult getTransactionByBlockNumberAndIndex(String blockNumOrTag, String index) + throws JsonRpcInvalidParamsException { Block block = wallet.getByJsonBlockId(blockNumOrTag); if (block == null) { return null; @@ -506,7 +515,8 @@ public TransactionResult getTransactionByBlockNumberAndIndex(String blockNumOrTa } @Override - public TransactionReceipt getTransactionReceipt(String txid) { + public TransactionReceipt getTransactionReceipt(String txid) + throws JsonRpcInvalidParamsException { byte[] txHash = hashToByteArray(txid); TransactionInfo transactionInfo = wallet.getTransactionInfoById(ByteString.copyFrom(txHash)); @@ -524,10 +534,11 @@ public TransactionReceipt getTransactionReceipt(String txid) { } @Override - public String getCall(CallArguments transactionCall, String blockNumOrTag) { + public String getCall(CallArguments transactionCall, String blockNumOrTag) + throws JsonRpcInvalidParamsException { if ("earliest".equalsIgnoreCase(blockNumOrTag) || "pending".equalsIgnoreCase(blockNumOrTag)) { - throw new JsonRpcInvalidParams("TAG [earliest | pending] not supported"); + throw new JsonRpcInvalidParamsException("TAG [earliest | pending] not supported"); } else if ("latest".equalsIgnoreCase(blockNumOrTag)) { //静态调用合约方法。 byte[] addressData = addressHashToByteArray(transactionCall.from); @@ -538,10 +549,10 @@ public String getCall(CallArguments transactionCall, String blockNumOrTag) { try { ByteArray.hexToBigInteger(blockNumOrTag).longValue(); } catch (Exception e) { - throw new JsonRpcInvalidParams("invalid block number"); + throw new JsonRpcInvalidParamsException("invalid block number"); } - throw new JsonRpcInvalidParams("QUANTITY not supported, just support TAG as latest"); + throw new JsonRpcInvalidParamsException("QUANTITY not supported, just support TAG as latest"); } } @@ -623,7 +634,7 @@ public String[] getAccounts() { } private TransactionJson buildCreateSmartContractTransaction(byte[] ownerAddress, - BuildArguments args) { + BuildArguments args) throws JsonRpcInvalidRequestException, JsonRpcInternalException { try { CreateSmartContract.Builder build = CreateSmartContract.newBuilder(); @@ -676,19 +687,20 @@ private TransactionJson buildCreateSmartContractTransaction(byte[] ownerAddress, return transactionJson; } catch (ContractValidateException e) { - throw new JsonRpcInvalidRequest(e.getMessage()); + throw new JsonRpcInvalidRequestException(e.getMessage()); } catch (Exception e) { - throw new JsonRpcInternalError(e.getMessage()); + throw new JsonRpcInternalException(e.getMessage()); } } private TransactionJson buildTransferContractTransaction(byte[] ownerAddress, - BuildArguments args) { + BuildArguments args) throws JsonRpcInvalidParamsException, JsonRpcInvalidRequestException, + JsonRpcInternalException { long amount; try { amount = ByteArray.hexToBigInteger(args.value).longValue(); } catch (Exception e) { - throw new JsonRpcInvalidParams("invalid input value"); + throw new JsonRpcInvalidParamsException("invalid input value"); } TransferContract.Builder build = TransferContract.newBuilder(); @@ -709,15 +721,16 @@ private TransactionJson buildTransferContractTransaction(byte[] ownerAddress, return transactionJson; } catch (ContractValidateException e) { - throw new JsonRpcInvalidRequest(e.getMessage()); + throw new JsonRpcInvalidRequestException(e.getMessage()); } catch (Exception e) { - throw new JsonRpcInternalError(e.getMessage()); + throw new JsonRpcInternalException(e.getMessage()); } } // from and to should not be null private TransactionJson buildTriggerSmartContractTransaction(byte[] ownerAddress, - BuildArguments args) { + BuildArguments args) throws JsonRpcInvalidParamsException, JsonRpcInvalidRequestException, + JsonRpcInternalException { byte[] contractAddress = addressHashToByteArray(args.to); TriggerSmartContract.Builder build = TriggerSmartContract.newBuilder(); @@ -753,14 +766,14 @@ private TransactionJson buildTriggerSmartContractTransaction(byte[] ownerAddress trx = setTransactionPermissionId(args.permissionId, trx); trxExtBuilder.setTransaction(trx); } catch (ContractValidateException e) { - throw new JsonRpcInvalidRequest(e.getMessage()); + throw new JsonRpcInvalidRequestException(e.getMessage()); } catch (Exception e) { String errString = "invalid json request"; if (e.getMessage() != null) { errString = e.getMessage().replaceAll("[\"]", "\'"); } - throw new JsonRpcInternalError(errString); + throw new JsonRpcInternalException(errString); } String jsonString = Util.printTransaction(trxExtBuilder.build().getTransaction(), args.visible); @@ -771,12 +784,14 @@ private TransactionJson buildTriggerSmartContractTransaction(byte[] ownerAddress } @Override - public TransactionJson buildTransaction(BuildArguments args) { + public TransactionJson buildTransaction(BuildArguments args) + throws JsonRpcInvalidParamsException, JsonRpcInvalidRequestException, + JsonRpcInternalException { byte[] fromAddressData; try { fromAddressData = addressHashToByteArray(args.from); - } catch (JsonRpcInvalidParams e) { - throw new JsonRpcInvalidRequest("invalid json request"); + } catch (JsonRpcInvalidParamsException e) { + throw new JsonRpcInvalidRequestException("invalid json request"); } // check possible ContractType From 49564493d1affc22d4a6e0096b461e840713000e Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Mon, 19 Jul 2021 12:33:44 +0800 Subject: [PATCH 079/341] feat: add eth_submitHashrate --- .../core/services/jsonrpc/TronJsonRpc.java | 66 ++++++++++--------- .../services/jsonrpc/TronJsonRpcImpl.java | 6 ++ 2 files changed, 42 insertions(+), 30 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index ae0aa3ef34e..12b3ed3c4b8 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -210,12 +210,6 @@ String getTrxBalance(String address, String blockNumOrTag) throws ItemNotFoundEx String getStorageAt(String address, String storageIdx, String blockNumOrTag) throws JsonRpcInvalidParamsException; - @JsonRpcMethod("eth_getTransactionCount") - @JsonRpcErrors({ - @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), - }) - String getSendTransactionCountOfAddress(String address, String blockNumOrTag); - @JsonRpcMethod("eth_getCode") @JsonRpcErrors({ @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), @@ -235,30 +229,6 @@ String getABIofSmartContract(String contractAddress, String bnOrId) @JsonRpcMethod("eth_estimateGas") String estimateGas(CallArguments args); - @JsonRpcMethod("eth_getCompilers") - @JsonRpcErrors({ - @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), - }) - String[] getCompilers(); - - @JsonRpcMethod("eth_compileSolidity") - @JsonRpcErrors({ - @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), - }) - CompilationResult ethCompileSolidity(String contract) throws Exception; - - @JsonRpcMethod("eth_compileLLL") - @JsonRpcErrors({ - @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), - }) - CompilationResult ethCompileLLL(String contract); - - @JsonRpcMethod("eth_compileSerpent") - @JsonRpcErrors({ - @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), - }) - CompilationResult ethCompileSerpent(String contract); - @JsonRpcMethod("eth_getTransactionByHash") @JsonRpcErrors({ @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), @@ -368,4 +338,40 @@ TransactionJson buildTransaction(BuildArguments args) @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), }) String parityNextNonce(String address); + + @JsonRpcMethod("eth_getTransactionCount") + @JsonRpcErrors({ + @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), + }) + String getSendTransactionCountOfAddress(String address, String blockNumOrTag); + + @JsonRpcMethod("eth_getCompilers") + @JsonRpcErrors({ + @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), + }) + String[] getCompilers(); + + @JsonRpcMethod("eth_compileSolidity") + @JsonRpcErrors({ + @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), + }) + CompilationResult ethCompileSolidity(String contract) throws Exception; + + @JsonRpcMethod("eth_compileLLL") + @JsonRpcErrors({ + @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), + }) + CompilationResult ethCompileLLL(String contract); + + @JsonRpcMethod("eth_compileSerpent") + @JsonRpcErrors({ + @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), + }) + CompilationResult ethCompileSerpent(String contract); + + @JsonRpcMethod("eth_submitHashrate") + @JsonRpcErrors({ + @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), + }) + CompilationResult ethSubmitHashrate(String hashrate, String id); } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index f4ec7fd1e47..8a84f9c8a4f 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -434,6 +434,12 @@ public CompilationResult ethCompileSerpent(String contract) { "the method eth_compileSerpent does not exist/is not available"); } + @Override + public CompilationResult ethSubmitHashrate(String hashrate, String id) { + throw new UnsupportedOperationException( + "the method eth_submitHashrate does not exist/is not available"); + } + @Override public TransactionResult getTransactionByHash(String txid) throws JsonRpcInvalidParamsException { byte[] txHash = hashToByteArray(txid); From feec2ebbea110f0b4af453c2c28149fe7aca75bb Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Mon, 19 Jul 2021 19:19:18 +0800 Subject: [PATCH 080/341] feat: modify callTokenValue to tokenValue --- .../java/org/tron/core/services/jsonrpc/BuildArguments.java | 2 +- .../java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java b/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java index f7676bf82e4..cdb1eb95d38 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java @@ -29,7 +29,7 @@ public class BuildArguments { public String nonce; //not used public Long tokenId = 0L; - public Long callTokenValue = 0L; + public Long tokenValue = 0L; public String abi = ""; // public Long callValue = 0L; public Long consumeUserResourcePercent = 0L; diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 8a84f9c8a4f..e93edbb7e97 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -646,7 +646,7 @@ private TransactionJson buildCreateSmartContractTransaction(byte[] ownerAddress, build.setOwnerAddress(ByteString.copyFrom(ownerAddress)); - build.setCallTokenValue(args.callTokenValue) + build.setCallTokenValue(args.tokenValue) .setTokenId(args.tokenId); ABI.Builder abiBuilder = ABI.newBuilder(); @@ -754,7 +754,7 @@ private TransactionJson buildTriggerSmartContractTransaction(byte[] ownerAddress build.setData(ByteString.copyFrom(new byte[0])); } - build.setCallTokenValue(args.callTokenValue) + build.setCallTokenValue(args.tokenValue) .setTokenId(args.tokenId) .setCallValue(args.parseCallValue()); From d289901d35f09edfd50a1cc0f4e083bddd8fc4ed Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Mon, 26 Jul 2021 22:19:26 +0800 Subject: [PATCH 081/341] feat: add transferasset to buildTransaction --- .../core/services/jsonrpc/BuildArguments.java | 13 ++- .../services/jsonrpc/TronJsonRpcImpl.java | 105 +++++++++++------- 2 files changed, 71 insertions(+), 47 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java b/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java index cdb1eb95d38..e1cfd356178 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java @@ -31,7 +31,6 @@ public class BuildArguments { public Long tokenId = 0L; public Long tokenValue = 0L; public String abi = ""; - // public Long callValue = 0L; public Long consumeUserResourcePercent = 0L; public Long originEnergyLimit = 0L; public String name = ""; @@ -65,10 +64,16 @@ public ContractType getContractType(Wallet wallet) throws JsonRpcInvalidRequestE if (smartContract != null) { contractType = ContractType.TriggerSmartContract; } else { - if (StringUtils.isEmpty(value)) { - throw new JsonRpcInvalidRequestException("invalid json request"); + // tokenId and tokenValue: trc10, value: TRX + if (tokenId > 0 && tokenValue > 0 && StringUtils.isEmpty(value)) { + contractType = ContractType.TransferAssetContract; + } else { + if (StringUtils.isNotEmpty(value)) { + contractType = ContractType.TransferContract; + } else { + throw new JsonRpcInvalidRequestException("invalid json request"); + } } - contractType = ContractType.TransferContract; } } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index e93edbb7e97..37de99d060e 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -10,6 +10,7 @@ import com.alibaba.fastjson.JSON; import com.google.protobuf.ByteString; +import com.google.protobuf.GeneratedMessageV3; import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; @@ -18,7 +19,6 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.tron.api.GrpcAPI.BytesMessage; import org.tron.api.GrpcAPI.Return; @@ -48,6 +48,7 @@ import org.tron.protos.Protocol.Transaction; import org.tron.protos.Protocol.Transaction.Contract.ContractType; import org.tron.protos.Protocol.TransactionInfo; +import org.tron.protos.contract.AssetIssueContractOuterClass.TransferAssetContract; import org.tron.protos.contract.BalanceContract.TransferContract; import org.tron.protos.contract.SmartContractOuterClass.CreateSmartContract; import org.tron.protos.contract.SmartContractOuterClass.SmartContract; @@ -665,10 +666,7 @@ private TransactionJson buildCreateSmartContractTransaction(byte[] ownerAddress, .setConsumeUserResourcePercent(args.consumeUserResourcePercent) .setOriginEnergyLimit(args.originEnergyLimit); - // todo ownerAddress is empty? - if (ArrayUtils.isNotEmpty(ownerAddress)) { - smartBuilder.setOriginAddress(ByteString.copyFrom(ownerAddress)); - } + smartBuilder.setOriginAddress(ByteString.copyFrom(ownerAddress)); // bytecode + parameter smartBuilder.setBytecode(ByteString.copyFrom(ByteArray.fromHexString(args.data))); @@ -699,40 +697,6 @@ private TransactionJson buildCreateSmartContractTransaction(byte[] ownerAddress, } } - private TransactionJson buildTransferContractTransaction(byte[] ownerAddress, - BuildArguments args) throws JsonRpcInvalidParamsException, JsonRpcInvalidRequestException, - JsonRpcInternalException { - long amount; - try { - amount = ByteArray.hexToBigInteger(args.value).longValue(); - } catch (Exception e) { - throw new JsonRpcInvalidParamsException("invalid input value"); - } - - TransferContract.Builder build = TransferContract.newBuilder(); - build.setOwnerAddress(ByteString.copyFrom(ownerAddress)) - .setToAddress(ByteString.copyFrom(addressHashToByteArray(args.to))) - .setAmount(amount); - - try { - Transaction tx = wallet.createTransactionCapsule(build.build(), ContractType.TransferContract) - .getInstance(); - tx = setTransactionPermissionId(args.permissionId, tx); - tx = setTransactionExtraData(args.extraData, tx, args.visible); - - String jsonString = Util.printCreateTransaction(tx, args.visible); - - TransactionJson transactionJson = new TransactionJson(); - transactionJson.transaction = JSON.parseObject(jsonString); - - return transactionJson; - } catch (ContractValidateException e) { - throw new JsonRpcInvalidRequestException(e.getMessage()); - } catch (Exception e) { - throw new JsonRpcInternalException(e.getMessage()); - } - } - // from and to should not be null private TransactionJson buildTriggerSmartContractTransaction(byte[] ownerAddress, BuildArguments args) throws JsonRpcInvalidParamsException, JsonRpcInvalidRequestException, @@ -758,11 +722,11 @@ private TransactionJson buildTriggerSmartContractTransaction(byte[] ownerAddress .setTokenId(args.tokenId) .setCallValue(args.parseCallValue()); - TransactionCapsule trxCap = wallet - .createTransactionCapsule(build.build(), ContractType.TriggerSmartContract); + Transaction tx = wallet + .createTransactionCapsule(build.build(), ContractType.TriggerSmartContract).getInstance(); - Transaction.Builder txBuilder = trxCap.getInstance().toBuilder(); - Transaction.raw.Builder rawBuilder = trxCap.getInstance().getRawData().toBuilder(); + Transaction.Builder txBuilder = tx.toBuilder(); + Transaction.raw.Builder rawBuilder = tx.getRawData().toBuilder(); rawBuilder.setFeeLimit(args.feeLimit); txBuilder.setRawData(rawBuilder); @@ -789,6 +753,59 @@ private TransactionJson buildTriggerSmartContractTransaction(byte[] ownerAddress return transactionJson; } + private TransactionJson createTransactionJson(GeneratedMessageV3.Builder build, + ContractType contractTyp, BuildArguments args) + throws JsonRpcInvalidRequestException, JsonRpcInternalException { + try { + Transaction tx = wallet + .createTransactionCapsule(build.build(), contractTyp) + .getInstance(); + tx = setTransactionPermissionId(args.permissionId, tx); + tx = setTransactionExtraData(args.extraData, tx, args.visible); + + String jsonString = Util.printCreateTransaction(tx, args.visible); + + TransactionJson transactionJson = new TransactionJson(); + transactionJson.transaction = JSON.parseObject(jsonString); + + return transactionJson; + } catch (ContractValidateException e) { + throw new JsonRpcInvalidRequestException(e.getMessage()); + } catch (Exception e) { + throw new JsonRpcInternalException(e.getMessage()); + } + } + + private TransactionJson buildTransferContractTransaction(byte[] ownerAddress, + BuildArguments args) throws JsonRpcInvalidParamsException, JsonRpcInvalidRequestException, + JsonRpcInternalException { + long amount; + try { + amount = ByteArray.hexToBigInteger(args.value).longValue(); + } catch (Exception e) { + throw new JsonRpcInvalidParamsException("invalid input value"); + } + + TransferContract.Builder build = TransferContract.newBuilder(); + build.setOwnerAddress(ByteString.copyFrom(ownerAddress)) + .setToAddress(ByteString.copyFrom(addressHashToByteArray(args.to))) + .setAmount(amount); + + return createTransactionJson(build, ContractType.TransferContract, args); + } + + private TransactionJson buildTransferAssetContractTransaction(byte[] ownerAddress, + BuildArguments args) throws JsonRpcInvalidParamsException, JsonRpcInvalidRequestException, + JsonRpcInternalException { + TransferAssetContract.Builder build = TransferAssetContract.newBuilder(); + build.setOwnerAddress(ByteString.copyFrom(ownerAddress)) + .setToAddress(ByteString.copyFrom(addressHashToByteArray(args.to))) + .setAssetName(ByteString.copyFrom(ByteArray.fromString(String.valueOf(args.tokenId)))) + .setAmount(args.tokenValue); + + return createTransactionJson(build, ContractType.TransferAssetContract, args); + } + @Override public TransactionJson buildTransaction(BuildArguments args) throws JsonRpcInvalidParamsException, JsonRpcInvalidRequestException, @@ -809,6 +826,8 @@ public TransactionJson buildTransaction(BuildArguments args) return buildTriggerSmartContractTransaction(fromAddressData, args); case ContractType.TransferContract_VALUE: return buildTransferContractTransaction(fromAddressData, args); + case ContractType.TransferAssetContract_VALUE: + return buildTransferAssetContractTransaction(fromAddressData, args); default: break; } From 4f258ae798e2310b03b42b15945c9f7c98ffdc9d Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Tue, 27 Jul 2021 11:26:08 +0800 Subject: [PATCH 082/341] typo --- .../core/services/jsonrpc/TronJsonRpcImpl.java | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 37de99d060e..c449dabd446 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -443,16 +443,13 @@ public CompilationResult ethSubmitHashrate(String hashrate, String id) { @Override public TransactionResult getTransactionByHash(String txid) throws JsonRpcInvalidParamsException { - byte[] txHash = hashToByteArray(txid); - TransactionInfo transactionInfo = wallet - .getTransactionInfoById(ByteString.copyFrom(txHash)); + .getTransactionInfoById(ByteString.copyFrom(hashToByteArray(txid))); if (transactionInfo == null) { return null; } - long blockNum = transactionInfo.getBlockNumber(); - Block block = wallet.getBlockByNum(blockNum); + Block block = wallet.getBlockByNum(transactionInfo.getBlockNumber()); if (block == null) { return null; } @@ -524,15 +521,13 @@ public TransactionResult getTransactionByBlockNumberAndIndex(String blockNumOrTa @Override public TransactionReceipt getTransactionReceipt(String txid) throws JsonRpcInvalidParamsException { - byte[] txHash = hashToByteArray(txid); - - TransactionInfo transactionInfo = wallet.getTransactionInfoById(ByteString.copyFrom(txHash)); + TransactionInfo transactionInfo = + wallet.getTransactionInfoById(ByteString.copyFrom(hashToByteArray(txid))); if (transactionInfo == null) { return null; } - long blockNum = transactionInfo.getBlockNumber(); - Block block = wallet.getBlockByNum(blockNum); + Block block = wallet.getBlockByNum(transactionInfo.getBlockNumber()); if (block == null) { return null; } From b8c58a4c750e7aa01f89be77adfa0bd2b46b1969 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Tue, 27 Jul 2021 12:02:59 +0800 Subject: [PATCH 083/341] feat: check transferasset input condition --- .../tron/core/services/jsonrpc/BuildArguments.java | 4 ++-- .../tron/core/services/jsonrpc/TronJsonRpcImpl.java | 11 +++-------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java b/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java index e1cfd356178..18cc911fd7a 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java @@ -65,7 +65,7 @@ public ContractType getContractType(Wallet wallet) throws JsonRpcInvalidRequestE contractType = ContractType.TriggerSmartContract; } else { // tokenId and tokenValue: trc10, value: TRX - if (tokenId > 0 && tokenValue > 0 && StringUtils.isEmpty(value)) { + if (tokenId > 0 && tokenValue > 0 && (StringUtils.isEmpty(value) || value.equals("0x0"))) { contractType = ContractType.TransferAssetContract; } else { if (StringUtils.isNotEmpty(value)) { @@ -80,7 +80,7 @@ public ContractType getContractType(Wallet wallet) throws JsonRpcInvalidRequestE return contractType; } - public long parseCallValue() throws JsonRpcInvalidParamsException { + public long parseValue() throws JsonRpcInvalidParamsException { long callValue = 0L; if (StringUtils.isNotEmpty(value)) { diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index c449dabd446..511e6b69559 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -657,7 +657,7 @@ private TransactionJson buildCreateSmartContractTransaction(byte[] ownerAddress, SmartContract.Builder smartBuilder = SmartContract.newBuilder(); smartBuilder .setAbi(abiBuilder) - .setCallValue(args.parseCallValue()) + .setCallValue(args.parseValue()) .setConsumeUserResourcePercent(args.consumeUserResourcePercent) .setOriginEnergyLimit(args.originEnergyLimit); @@ -715,7 +715,7 @@ private TransactionJson buildTriggerSmartContractTransaction(byte[] ownerAddress build.setCallTokenValue(args.tokenValue) .setTokenId(args.tokenId) - .setCallValue(args.parseCallValue()); + .setCallValue(args.parseValue()); Transaction tx = wallet .createTransactionCapsule(build.build(), ContractType.TriggerSmartContract).getInstance(); @@ -774,12 +774,7 @@ private TransactionJson createTransactionJson(GeneratedMessageV3.Builder buil private TransactionJson buildTransferContractTransaction(byte[] ownerAddress, BuildArguments args) throws JsonRpcInvalidParamsException, JsonRpcInvalidRequestException, JsonRpcInternalException { - long amount; - try { - amount = ByteArray.hexToBigInteger(args.value).longValue(); - } catch (Exception e) { - throw new JsonRpcInvalidParamsException("invalid input value"); - } + long amount = args.parseValue(); TransferContract.Builder build = TransferContract.newBuilder(); build.setOwnerAddress(ByteString.copyFrom(ownerAddress)) From cc02536b0eceed3302f333107f573c8c9910aef2 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Tue, 27 Jul 2021 15:45:36 +0800 Subject: [PATCH 084/341] feat: add gasUsed in TransactionReceipt --- .../common/parameter/CommonParameter.java | 2 +- .../src/main/java/org/tron/core/Constant.java | 2 +- .../java/org/tron/core/config/args/Args.java | 8 +++---- .../core/services/jsonrpc/JsonRpcApiUtil.java | 7 +++++-- .../services/jsonrpc/TransactionReceipt.java | 21 ++++++++++++++++--- 5 files changed, 29 insertions(+), 11 deletions(-) diff --git a/common/src/main/java/org/tron/common/parameter/CommonParameter.java b/common/src/main/java/org/tron/common/parameter/CommonParameter.java index 77b908a7f21..4bf24f9c2c2 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -179,7 +179,7 @@ public class CommonParameter { public int pBFTJsonRpcHttpPort; @Getter @Setter - public String energyCost; + public String energyCostHistory; @Getter @Setter @Parameter(names = {"--rpc-thread"}, description = "Num of gRPC thread") diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index 3ff4a230641..7969500804d 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -94,7 +94,7 @@ public class Constant { public static final String NODE_HTTP_FULLNODE_ENABLE = "node.http.fullNodeEnable"; public static final String NODE_HTTP_SOLIDITY_ENABLE = "node.http.solidityEnable"; public static final String NODE_HTTP_PBFT_PORT = "node.http.PBFTPort"; - public static final String NODE_ENERGY_COST = "node.http.energyCost"; + public static final String NODE_ENERGY_COST_HISTORY = "node.http.energyCostHistory"; public static final String NODE_HTTP_JSONRPC_FULLNODE_ENABLE = "node.http.jsonRpcFullNodeEnable"; public static final String NODE_HTTP_JSONRPC_FULLNODE_PORT = "node.http.jsonRpcFullNodePort"; diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index 1218fca840c..75c2478e6b9 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -135,7 +135,7 @@ public static void clearParam() { PARAMETER.fullNodeJsonRpcHttpPort = 0; PARAMETER.solidityJsonRpcHttpPort = 0; PARAMETER.pBFTJsonRpcHttpPort = 0; - PARAMETER.energyCost = ""; + PARAMETER.energyCostHistory = ""; PARAMETER.maintenanceTimeInterval = 0; PARAMETER.proposalExpireTime = 0; PARAMETER.checkFrozenTime = 1; @@ -484,9 +484,9 @@ public static void setParam(final String[] args, final String confFileName) { config.hasPath(Constant.NODE_HTTP_JSONRPC_PBFT_PORT) ? config.getInt(Constant.NODE_HTTP_JSONRPC_PBFT_PORT) : 8095; - PARAMETER.energyCost = - config.hasPath(Constant.NODE_ENERGY_COST) - ? config.getString(Constant.NODE_ENERGY_COST) : "27553334:140,25304425:40,0:10"; + PARAMETER.energyCostHistory = + config.hasPath(Constant.NODE_ENERGY_COST_HISTORY) + ? config.getString(Constant.NODE_ENERGY_COST_HISTORY) : "25304425:10,27553334:40"; PARAMETER.rpcThreadNum = config.hasPath(Constant.NODE_RPC_THREAD) ? config.getInt(Constant.NODE_RPC_THREAD) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index 946c55c98e0..b2505c98607 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -454,8 +454,11 @@ public static long getUnfreezeAssetAmount(byte[] addressBytes, Wallet wallet) { return amount; } + /** + * [blockNumTag:energyFee] when blockNum < blockNumTag, use energyFee value + * */ public static long calEngergyFee(long blockNum, Wallet wallet) { - String energyCost = CommonParameter.getInstance().getEnergyCost(); + String energyCost = CommonParameter.getInstance().getEnergyCostHistory(); if (energyCost.isEmpty()) { return wallet.getEnergyFee(); } else { @@ -464,7 +467,7 @@ public static long calEngergyFee(long blockNum, Wallet wallet) { String[] costStrArray = data.split(":"); long num = Long.parseLong(costStrArray[0]); long cost = Long.parseLong(costStrArray[1]); - if (blockNum >= num) { + if (blockNum < num) { return cost; } } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java index ad8db426049..7c2e3f42f47 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java @@ -1,6 +1,7 @@ package org.tron.core.services.jsonrpc; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.convertToTronAddress; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.calEngergyFee; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getToAddress; import com.fasterxml.jackson.annotation.JsonInclude; @@ -55,17 +56,33 @@ public TransactionLog() { public TransactionReceipt(Protocol.Block block, TransactionInfo txInfo, Wallet wallet) { BlockCapsule blockCapsule = new BlockCapsule(block); String txid = ByteArray.toHexString(txInfo.getId().toByteArray()); + long blockNum = blockCapsule.getNum(); Protocol.Transaction transaction = null; + long cumulativeGas = 0; long cumulativeLogCount = 0; - TransactionInfoList infoList = wallet.getTransactionInfoByBlockNum(blockCapsule.getNum()); + long sunPerEnergy = Constant.SUN_PER_ENERGY; + long dynamicEnergyFee = calEngergyFee(blockNum, wallet); + if (dynamicEnergyFee > 0) { + sunPerEnergy = dynamicEnergyFee; + } + + TransactionInfoList infoList = wallet.getTransactionInfoByBlockNum(blockNum); for (int index = 0; index < infoList.getTransactionInfoCount(); index++) { TransactionInfo info = infoList.getTransactionInfo(index); ResourceReceipt resourceReceipt = info.getReceipt(); + // the sum of energy usage by origin, energy(by freeze) and trx + long energyUsage = resourceReceipt.getOriginEnergyUsage() + + resourceReceipt.getEnergyUsage() + + resourceReceipt.getEnergyFee() / sunPerEnergy; + cumulativeGas += energyUsage; + if (ByteArray.toHexString(info.getId().toByteArray()).equals(txid)) { transactionIndex = ByteArray.toJsonHex(index); + cumulativeGasUsed = ByteArray.toJsonHex(cumulativeGas); + gasUsed = ByteArray.toJsonHex(energyUsage); status = resourceReceipt.getResultValue() == 1 ? "0x1" : "0x0"; transaction = block.getTransactions(index); @@ -75,8 +92,6 @@ public TransactionReceipt(Protocol.Block block, TransactionInfo txInfo, Wallet w } } - cumulativeGasUsed = null; - gasUsed = null; blockHash = ByteArray.toJsonHex(blockCapsule.getBlockId().getBytes()); blockNumber = ByteArray.toJsonHex(blockCapsule.getNum()); transactionHash = ByteArray.toJsonHex(txInfo.getId().toByteArray()); From d3e22241619c60c6888d0891791fbdee30338323 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Tue, 27 Jul 2021 16:28:19 +0800 Subject: [PATCH 085/341] feat: use energyUsageTotal as gas used --- .../common/parameter/CommonParameter.java | 3 --- .../src/main/java/org/tron/core/Constant.java | 1 - .../java/org/tron/core/config/args/Args.java | 5 ----- .../core/services/jsonrpc/JsonRpcApiUtil.java | 22 ------------------- .../services/jsonrpc/TransactionReceipt.java | 13 +---------- 5 files changed, 1 insertion(+), 43 deletions(-) diff --git a/common/src/main/java/org/tron/common/parameter/CommonParameter.java b/common/src/main/java/org/tron/common/parameter/CommonParameter.java index 4bf24f9c2c2..9e45a20185c 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -179,9 +179,6 @@ public class CommonParameter { public int pBFTJsonRpcHttpPort; @Getter @Setter - public String energyCostHistory; - @Getter - @Setter @Parameter(names = {"--rpc-thread"}, description = "Num of gRPC thread") public int rpcThreadNum; @Getter diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index 7969500804d..50ccb4dbda3 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -94,7 +94,6 @@ public class Constant { public static final String NODE_HTTP_FULLNODE_ENABLE = "node.http.fullNodeEnable"; public static final String NODE_HTTP_SOLIDITY_ENABLE = "node.http.solidityEnable"; public static final String NODE_HTTP_PBFT_PORT = "node.http.PBFTPort"; - public static final String NODE_ENERGY_COST_HISTORY = "node.http.energyCostHistory"; public static final String NODE_HTTP_JSONRPC_FULLNODE_ENABLE = "node.http.jsonRpcFullNodeEnable"; public static final String NODE_HTTP_JSONRPC_FULLNODE_PORT = "node.http.jsonRpcFullNodePort"; diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index 75c2478e6b9..4695aca376e 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -135,7 +135,6 @@ public static void clearParam() { PARAMETER.fullNodeJsonRpcHttpPort = 0; PARAMETER.solidityJsonRpcHttpPort = 0; PARAMETER.pBFTJsonRpcHttpPort = 0; - PARAMETER.energyCostHistory = ""; PARAMETER.maintenanceTimeInterval = 0; PARAMETER.proposalExpireTime = 0; PARAMETER.checkFrozenTime = 1; @@ -484,10 +483,6 @@ public static void setParam(final String[] args, final String confFileName) { config.hasPath(Constant.NODE_HTTP_JSONRPC_PBFT_PORT) ? config.getInt(Constant.NODE_HTTP_JSONRPC_PBFT_PORT) : 8095; - PARAMETER.energyCostHistory = - config.hasPath(Constant.NODE_ENERGY_COST_HISTORY) - ? config.getString(Constant.NODE_ENERGY_COST_HISTORY) : "25304425:10,27553334:40"; - PARAMETER.rpcThreadNum = config.hasPath(Constant.NODE_RPC_THREAD) ? config.getInt(Constant.NODE_RPC_THREAD) : (Runtime.getRuntime().availableProcessors() + 1) / 2; diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index b2505c98607..89a2c521640 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -454,28 +454,6 @@ public static long getUnfreezeAssetAmount(byte[] addressBytes, Wallet wallet) { return amount; } - /** - * [blockNumTag:energyFee] when blockNum < blockNumTag, use energyFee value - * */ - public static long calEngergyFee(long blockNum, Wallet wallet) { - String energyCost = CommonParameter.getInstance().getEnergyCostHistory(); - if (energyCost.isEmpty()) { - return wallet.getEnergyFee(); - } else { - String[] costList = energyCost.split(","); - for (String data : costList) { - String[] costStrArray = data.split(":"); - long num = Long.parseLong(costStrArray[0]); - long cost = Long.parseLong(costStrArray[1]); - if (blockNum < num) { - return cost; - } - } - - return wallet.getEnergyFee(); - } - } - public static byte[] addressHashToByteArray(String hash) throws JsonRpcInvalidParamsException { byte[] bHash; try { diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java index 7c2e3f42f47..6772cc4fa48 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java @@ -1,7 +1,6 @@ package org.tron.core.services.jsonrpc; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.convertToTronAddress; -import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.calEngergyFee; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getToAddress; import com.fasterxml.jackson.annotation.JsonInclude; @@ -9,7 +8,6 @@ import java.util.List; import org.tron.api.GrpcAPI.TransactionInfoList; import org.tron.common.utils.ByteArray; -import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.TransactionCapsule; @@ -62,21 +60,12 @@ public TransactionReceipt(Protocol.Block block, TransactionInfo txInfo, Wallet w long cumulativeGas = 0; long cumulativeLogCount = 0; - long sunPerEnergy = Constant.SUN_PER_ENERGY; - long dynamicEnergyFee = calEngergyFee(blockNum, wallet); - if (dynamicEnergyFee > 0) { - sunPerEnergy = dynamicEnergyFee; - } - TransactionInfoList infoList = wallet.getTransactionInfoByBlockNum(blockNum); for (int index = 0; index < infoList.getTransactionInfoCount(); index++) { TransactionInfo info = infoList.getTransactionInfo(index); ResourceReceipt resourceReceipt = info.getReceipt(); - // the sum of energy usage by origin, energy(by freeze) and trx - long energyUsage = resourceReceipt.getOriginEnergyUsage() - + resourceReceipt.getEnergyUsage() - + resourceReceipt.getEnergyFee() / sunPerEnergy; + long energyUsage = resourceReceipt.getEnergyUsageTotal(); cumulativeGas += energyUsage; if (ByteArray.toHexString(info.getId().toByteArray()).equals(txid)) { From e8ab709b526a042076b85aca5201bdc8762d1772 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 28 Jul 2021 15:36:53 +0800 Subject: [PATCH 086/341] feat: set shouldLogInvocationErrors to false --- .../java/org/tron/core/services/jsonrpc/JsonRpcServlet.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java index d89258e4b63..f2bd85c4da3 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java @@ -41,6 +41,7 @@ public void init(ServletConfig config) throws ServletException { true); rpcServer = new JsonRpcServer(compositeService); + HttpStatusCodeProvider httpStatusCodeProvider = new HttpStatusCodeProvider() { @Override public int getHttpStatusCode(int resultCode) { @@ -53,6 +54,8 @@ public Integer getJsonRpcCode(int httpStatusCode) { } }; rpcServer.setHttpStatusCodeProvider(httpStatusCodeProvider); + + rpcServer.setShouldLogInvocationErrors(false); } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { From 92525cd83bb5b8b271c239a3ae0c25c7d89afb7d Mon Sep 17 00:00:00 2001 From: wubin01 Date: Thu, 5 Aug 2021 14:26:42 +0800 Subject: [PATCH 087/341] optimize broadcast logic --- .../main/java/org/tron/core/db/Manager.java | 19 ++++++--- .../org/tron/core/net/TronNetDelegate.java | 9 ++-- .../net/messagehandler/BlockMsgHandler.java | 41 +++++++++++-------- 3 files changed, 41 insertions(+), 28 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 41397818a63..295d169a9e4 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -979,6 +979,19 @@ public List getVerifyTxs(BlockCapsule block) { return txs; } + public boolean validBlock(final BlockCapsule block) throws ValidateSignatureException { + if (!block.validateSignature(chainBaseManager.getDynamicPropertiesStore(), + chainBaseManager.getAccountStore())) { + logger.warn("Validate signature failed. {}", block.getInstance()); + return false; + } + if (!consensus.validBlock(block)) { + logger.warn("Validate witness failed. {}", block.getInstance()); + return false; + } + return true; + } + /** * save a block. */ @@ -998,12 +1011,6 @@ public synchronized void pushBlock(final BlockCapsule block) try (PendingManager pm = new PendingManager(this)) { if (!block.generatedByMyself) { - if (!block.validateSignature(chainBaseManager.getDynamicPropertiesStore(), - chainBaseManager.getAccountStore())) { - logger.warn("The signature is not validated."); - throw new BadBlockException("The signature is not validated"); - } - if (!block.calcMerkleRoot().equals(block.getMerkleRoot())) { logger.warn( "The merkle root doesn't match, Calc result is " diff --git a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java index 06b831712f5..6c6296244cb 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java +++ b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java @@ -261,11 +261,12 @@ public void pushTransaction(TransactionCapsule trx) throws P2pException { } } - public boolean validBlock(BlockCapsule block) throws P2pException { + public void validBlock(BlockCapsule block) throws P2pException { try { - return witnessScheduleStore.getActiveWitnesses().contains(block.getWitnessAddress()) - && block - .validateSignature(dbManager.getDynamicPropertiesStore(), dbManager.getAccountStore()); + if (dbManager.validBlock(block)) { + throw new P2pException(TypeEnum.BAD_BLOCK, + "Valid block failed: " + block.getBlockId().toString()); + } } catch (ValidateSignatureException e) { throw new P2pException(TypeEnum.BAD_BLOCK, e); } diff --git a/framework/src/main/java/org/tron/core/net/messagehandler/BlockMsgHandler.java b/framework/src/main/java/org/tron/core/net/messagehandler/BlockMsgHandler.java index b47918e12cb..2f922277cd0 100644 --- a/framework/src/main/java/org/tron/core/net/messagehandler/BlockMsgHandler.java +++ b/framework/src/main/java/org/tron/core/net/messagehandler/BlockMsgHandler.java @@ -106,29 +106,34 @@ private void processBlock(PeerConnection peer, BlockCapsule block) throws P2pExc advService.addInvToCache(item); } - if (fastForward) { - if (block.getNum() < tronNetDelegate.getHeadBlockId().getNum()) { - logger.warn("Receive a low block {}, head {}", - blockId.getString(), tronNetDelegate.getHeadBlockId().getString()); - return; - } - if (tronNetDelegate.validBlock(block)) { - advService.fastForward(new BlockMessage(block)); - tronNetDelegate.trustNode(peer); - } + if (block.getNum() < tronNetDelegate.getHeadBlockId().getNum()) { + logger.warn("Receive a low block {}, head {}", + blockId.getString(), tronNetDelegate.getHeadBlockId().getString()); + return; } - tronNetDelegate.processBlock(block, false); - witnessProductBlockService.validWitnessProductTwoBlock(block); - tronNetDelegate.getActivePeer().forEach(p -> { - if (p.getAdvInvReceive().getIfPresent(blockId) != null) { - p.setBlockBothHave(blockId); - } - }); + tronNetDelegate.validBlock(block); - if (!fastForward) { + if (fastForward) { + advService.fastForward(new BlockMessage(block)); + tronNetDelegate.trustNode(peer); + } else { advService.broadcast(new BlockMessage(block)); } + + try { + tronNetDelegate.processBlock(block, false); + + witnessProductBlockService.validWitnessProductTwoBlock(block); + + tronNetDelegate.getActivePeer().forEach(p -> { + if (p.getAdvInvReceive().getIfPresent(blockId) != null) { + p.setBlockBothHave(blockId); + } + }); + } catch (Exception e) { + logger.warn("Process block {} from peer {} failed.", blockId, peer.getInetAddress()); + } } } From e30007821cce397864b140fd501add670c769f97 Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Thu, 5 Aug 2021 15:02:29 +0800 Subject: [PATCH 088/341] add rewrite manifest opt --- start.sh | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 97 insertions(+), 5 deletions(-) diff --git a/start.sh b/start.sh index 849d18450fc..bd58fd2d036 100644 --- a/start.sh +++ b/start.sh @@ -1,15 +1,98 @@ #!/bin/bash APP=$1 +MANIFEST_OPT=$2 +ALL_OPT=$* +NEED_REBUILD=0 + +if [[ $1 == '--rewrite--manifest' ]] || [[ $1 == '--r' ]] ; then + APP='' + NEED_REBUILD=1 + elif [[ $1 == '--rewrite--manifest' ]] || [[ $1 == '--r' ]] ; then + NEED_REBUILD=1 +fi + +rebuildManifest() { + if [[ $NEED_REBUILD == 1 ]] ; then + buildManifest + fi +} + + +buildManifest() { + ARCHIVE_JAR='ArchiveManifest.jar' + java -jar $ARCHIVE_JAR $ALL_OPT + ret=$? + if [[ $ret == 0 ]] ; then + echo 'rebuild manifest success' + else + echo 'rebuild manifest fail, log in logs/archive.log' + fi + return ret +} + +checkMemory() { + ALLOW_MEMORY=16000000 + ALLOW_MAX_MEMORY=32000000 + MAX_MATESPACE_SIZE=' -XX:MaxMetaspaceSize=512m ' + total=`cat /proc/meminfo |grep MemTotal |awk -F ' ' '{print $2}'` + # total < ALLOW_MEN + if [ $total -lt $ALLOW_MEMORY ] ; then + echo "Direct memory must be greater than $ALLOW_MEMORY!, current memory: $total!!" + exit + fi + if [[ $total -gt $ALLOW_MEMORY ]] && [[ $total -lt $ALLOW_MAX_MEMORY ]] ; then +echo 1 $total + MAX_NEW_SIZE=' -XX:NewSize=3072m -XX:MaxNewSize=3072m ' + MEM_OPT="$MAX_MATESPACE_SIZE $MAX_NEW_SIZE" + + elif [[ $total -gt $ALLOW_MEMORY ]] ; then +echo 2 $total + NEW_RATIO=' -XX:NewSize=6144m -XX:MaxNewSize=6144m ' + MEM_OPT="$MAX_MATESPACE_SIZE $NEW_RATIO" + fi +} + APP=${APP:-"FullNode"} START_OPT=`echo ${@:2}` JAR_NAME="$APP.jar" MAX_STOP_TIME=60 +MEM_OPT='' checkpid() { pid=`ps -ef | grep $JAR_NAME |grep -v grep | awk '{print $2}'` return $pid } +checkPath(){ + path='output-directory/database' + flag=1 + for p in ${ALL_OPT} + do + if [[ $flag == 0 ]] ; then + path=`echo $p` + break + fi + if [[ $p == '-d' || $p == '--database-directory' ]] ; then + path='' + flag=0 + fi + done + + if [[ -z "${path}" ]]; then + echo '-d /path or --database-directory /path' + return 1 + fi + + if [[ -d ${path} ]]; then + return 0 + else + echo $path 'not exist' + return 1 + fi +} + + + stopService() { count=1 while [ $count -le $MAX_STOP_TIME ]; do @@ -32,15 +115,24 @@ stopService() { startService() { echo `date` >> start.log total=`cat /proc/meminfo |grep MemTotal |awk -F ' ' '{print $2}'` - xmx=`echo "$total/1024/1024*0.8" | bc |awk -F. '{print $1"g"}'` + xmx=`echo "$total/1024/1024*0.6" | bc |awk -F. '{print $1"g"}'` + directmem=`echo "$total/1024/1024*0.1" | bc |awk -F. '{print $1"g"}'` logtime=`date +%Y-%m-%d_%H-%M-%S` - nohup java -Xmx$xmx -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -Xloggc:./gc.log\ - -XX:+PrintGCDateStamps -XX:+CMSParallelRemarkEnabled -XX:ReservedCodeCacheSize=256m\ - -XX:+CMSScavengeBeforeRemark -jar $JAR_NAME $START_OPT -c config.conf >> start.log 2>&1 & - + export LD_PRELOAD="/usr/lib64/libtcmalloc.so" + nohup java -Xms$xmx -Xmx$xmx -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -Xloggc:./gc.log\ + -XX:+PrintGCDateStamps -XX:+CMSParallelRemarkEnabled -XX:ReservedCodeCacheSize=256m -XX:+UseCodeCacheFlushing\ + $MEM_OPT -XX:MaxDirectMemorySize=$directmem -XX:+HeapDumpOnOutOfMemoryError -jar $JAR_NAME $START_OPT -c config.conf >> start.log 2>&1 & pid=`ps -ef |grep $JAR_NAME |grep -v grep |awk '{print $2}'` echo "start java-tron with pid $pid on $HOSTNAME" } stopService +checkPath +if [[ 0 == $? ]] ; then + rebuildManifest +else + exit -1 +fi +sleep 5 +checkMemory startService From 5af5c738c8b69bf3b19ed968abb78f019a4a5525 Mon Sep 17 00:00:00 2001 From: sophiawang <1975054324@qq.com> Date: Thu, 5 Aug 2021 18:39:12 +0800 Subject: [PATCH 089/341] add cases for solidity v0.8.6 --- .../newGrammar/FixbugTest086.java | 147 +++++++++ .../newGrammar/FunctionArray2Storage086.java | 158 ++++++++++ .../newGrammar/NewFeatureForSolc086.java | 294 ++++++++++++++++++ .../resources/soliditycode/NewFeature086.sol | 115 +++++++ ...stractContractWithMapParamsConstructor.sol | 23 ++ .../function_type_array_to_storage.sol | 45 +++ ...kip_unimplemented_in_abstract_contract.sol | 22 ++ 7 files changed, 804 insertions(+) create mode 100644 framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/FixbugTest086.java create mode 100644 framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/FunctionArray2Storage086.java create mode 100644 framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/NewFeatureForSolc086.java create mode 100644 framework/src/test/resources/soliditycode/NewFeature086.sol create mode 100644 framework/src/test/resources/soliditycode/abstractContractWithMapParamsConstructor.sol create mode 100644 framework/src/test/resources/soliditycode/function_type_array_to_storage.sol create mode 100644 framework/src/test/resources/soliditycode/super_skip_unimplemented_in_abstract_contract.sol diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/FixbugTest086.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/FixbugTest086.java new file mode 100644 index 00000000000..cd31d1f6826 --- /dev/null +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/FixbugTest086.java @@ -0,0 +1,147 @@ +package stest.tron.wallet.dailybuild.tvmnewcommand.newGrammar; + +import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; +import java.util.HashMap; +import java.util.Optional; +import java.util.concurrent.TimeUnit; +import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Test; +import org.tron.api.WalletGrpc; +import org.tron.common.crypto.ECKey; +import org.tron.common.utils.ByteArray; +import org.tron.common.utils.Utils; +import org.tron.core.Wallet; +import org.tron.protos.Protocol; +import org.tron.protos.contract.SmartContractOuterClass; +import stest.tron.wallet.common.client.Configuration; +import stest.tron.wallet.common.client.Parameter; +import stest.tron.wallet.common.client.utils.PublicMethed; + + + + +@Slf4j +public class FixbugTest086 { + + private final String testNetAccountKey = Configuration.getByPath("testng.conf") + .getString("foundationAccount.key2"); + private final byte[] testNetAccountAddress = PublicMethed.getFinalAddress(testNetAccountKey); + byte[] mapKeyContract = null; + ECKey ecKey1 = new ECKey(Utils.getRandom()); + byte[] contractExcAddress = ecKey1.getAddress(); + String contractExcKey = ByteArray.toHexString(ecKey1.getPrivKeyBytes()); + private Long maxFeeLimit = Configuration.getByPath("testng.conf") + .getLong("defaultParameter.maxFeeLimit"); + private ManagedChannel channelFull = null; + private WalletGrpc.WalletBlockingStub blockingStubFull = null; + + private String fullnode = Configuration.getByPath("testng.conf") + .getStringList("fullnode.ip.list").get(0); + + @BeforeSuite + public void beforeSuite() { + Wallet wallet = new Wallet(); + Wallet.setAddressPreFixByte(Parameter.CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); + } + + /** + * constructor. + */ + + @BeforeClass(enabled = true) + public void beforeClass() { + PublicMethed.printAddress(contractExcKey); + channelFull = ManagedChannelBuilder.forTarget(fullnode) + .usePlaintext(true) + .build(); + blockingStubFull = WalletGrpc.newBlockingStub(channelFull); + + Assert.assertTrue(PublicMethed + .sendcoin(contractExcAddress, 300100_000_000L, + testNetAccountAddress, testNetAccountKey, blockingStubFull)); + PublicMethed.waitProduceNextBlock(blockingStubFull); + + String filePath = + "src/test/resources/soliditycode/abstractContractWithMapParamsConstructor.sol"; + String contractName = "Cat"; + HashMap retMap = PublicMethed.getBycodeAbi(filePath, contractName); + + String code = retMap.get("byteCode").toString(); + String abi = retMap.get("abI").toString(); + mapKeyContract = PublicMethed.deployContract(contractName, abi, code, "", maxFeeLimit, + 0L, 100, null, contractExcKey, + contractExcAddress, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + SmartContractOuterClass.SmartContract smartContract = PublicMethed.getContract(mapKeyContract, + blockingStubFull); + Assert.assertNotNull(smartContract.getAbi()); + } + + + @Test(enabled = true, description = "abstract With Map Params") + public void test01ContractWithMapParams() { + String triggerTxid = PublicMethed.triggerContract(mapKeyContract, "getMapValue()", "#", false, + 0, maxFeeLimit, contractExcAddress, contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + + Optional transactionInfo = PublicMethed + .getTransactionInfoById(triggerTxid, blockingStubFull); + Assert.assertEquals(0, transactionInfo.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.SUCCESS, + transactionInfo.get().getReceipt().getResult()); + Assert.assertEquals(20, + ByteArray.toInt(transactionInfo.get().getContractResult(0).toByteArray())); + } + + + @Test(enabled = true, description = " super skip unimplemented in abstract contract") + public void test02SkipUnimplemented() { + String filePath = + "src/test/resources/soliditycode/super_skip_unimplemented_in_abstract_contract.sol"; + String contractName = "B"; + HashMap retMap = PublicMethed.getBycodeAbi(filePath, contractName); + + String code = retMap.get("byteCode").toString(); + String abi = retMap.get("abI").toString(); + mapKeyContract = PublicMethed.deployContract(contractName, abi, code, "", maxFeeLimit, + 0L, 100, null, contractExcKey, + contractExcAddress, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + SmartContractOuterClass.SmartContract smartContract = PublicMethed.getContract(mapKeyContract, + blockingStubFull); + Assert.assertNotNull(smartContract.getAbi()); + + String triggerTxid = PublicMethed.triggerContract(mapKeyContract, "f()", "#", false, + 0, maxFeeLimit, contractExcAddress, contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + + Optional transactionInfo = PublicMethed + .getTransactionInfoById(triggerTxid, blockingStubFull); + Assert.assertEquals(0, transactionInfo.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.SUCCESS, + transactionInfo.get().getReceipt().getResult()); + Assert.assertEquals(42, + ByteArray.toInt(transactionInfo.get().getContractResult(0).toByteArray())); + } + + + /** + * constructor. + */ + @AfterClass + public void shutdown() throws InterruptedException { + PublicMethed.freedResource(contractExcAddress, contractExcKey, + testNetAccountAddress, blockingStubFull); + if (channelFull != null) { + channelFull.shutdown().awaitTermination(5, TimeUnit.SECONDS); + } + } + + +} + diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/FunctionArray2Storage086.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/FunctionArray2Storage086.java new file mode 100644 index 00000000000..9977fc94cc8 --- /dev/null +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/FunctionArray2Storage086.java @@ -0,0 +1,158 @@ +package stest.tron.wallet.dailybuild.tvmnewcommand.newGrammar; + +import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; +import java.util.HashMap; +import java.util.Optional; +import java.util.concurrent.TimeUnit; +import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Test; +import org.tron.api.WalletGrpc; +import org.tron.common.crypto.ECKey; +import org.tron.common.utils.ByteArray; +import org.tron.common.utils.Utils; +import org.tron.core.Wallet; +import org.tron.protos.Protocol; +import org.tron.protos.contract.SmartContractOuterClass; +import stest.tron.wallet.common.client.Configuration; +import stest.tron.wallet.common.client.Parameter; +import stest.tron.wallet.common.client.utils.PublicMethed; + + + + +@Slf4j +public class FunctionArray2Storage086 { + + private final String testNetAccountKey = Configuration.getByPath("testng.conf") + .getString("foundationAccount.key2"); + private final byte[] testNetAccountAddress = PublicMethed.getFinalAddress(testNetAccountKey); + byte[] mapKeyContract = null; + ECKey ecKey1 = new ECKey(Utils.getRandom()); + byte[] contractExcAddress = ecKey1.getAddress(); + String contractExcKey = ByteArray.toHexString(ecKey1.getPrivKeyBytes()); + private Long maxFeeLimit = Configuration.getByPath("testng.conf") + .getLong("defaultParameter.maxFeeLimit"); + private ManagedChannel channelFull = null; + private WalletGrpc.WalletBlockingStub blockingStubFull = null; + + private String fullnode = Configuration.getByPath("testng.conf") + .getStringList("fullnode.ip.list").get(0); + + @BeforeSuite + public void beforeSuite() { + Wallet wallet = new Wallet(); + Wallet.setAddressPreFixByte(Parameter.CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); + } + + /** + * constructor. + */ + + @BeforeClass(enabled = true) + public void beforeClass() { + PublicMethed.printAddress(contractExcKey); + channelFull = ManagedChannelBuilder.forTarget(fullnode) + .usePlaintext(true) + .build(); + blockingStubFull = WalletGrpc.newBlockingStub(channelFull); + + Assert.assertTrue(PublicMethed + .sendcoin(contractExcAddress, 300100_000_000L, + testNetAccountAddress, testNetAccountKey, blockingStubFull)); + PublicMethed.waitProduceNextBlock(blockingStubFull); + + String filePath = "src/test/resources/soliditycode/function_type_array_to_storage.sol"; + String contractName = "C"; + HashMap retMap = PublicMethed.getBycodeAbi(filePath, contractName); + + String code = retMap.get("byteCode").toString(); + String abi = retMap.get("abI").toString(); + mapKeyContract = PublicMethed.deployContract(contractName, abi, code, "", maxFeeLimit, + 500000000L, 100, null, contractExcKey, + contractExcAddress, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + SmartContractOuterClass.SmartContract smartContract = PublicMethed.getContract(mapKeyContract, + blockingStubFull); + Assert.assertNotNull(smartContract.getAbi()); + } + + + @Test(enabled = true, description = "function array test view to default") + public void test01View2Default() { + String triggerTxid = + PublicMethed.triggerContract(mapKeyContract, "testViewToDefault()", "#", false, + 0, maxFeeLimit, contractExcAddress, contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + + Optional transactionInfo = PublicMethed + .getTransactionInfoById(triggerTxid, blockingStubFull); + Assert.assertEquals(0, transactionInfo.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.SUCCESS, + transactionInfo.get().getReceipt().getResult()); + Assert.assertEquals(12, + ByteArray.toInt(transactionInfo.get().getContractResult(0).substring(0, 32).toByteArray())); + Assert.assertEquals(22, + ByteArray.toInt(transactionInfo.get().getContractResult(0) + .substring(32, 64).toByteArray())); + } + + @Test(enabled = true, description = "function array pure to default") + public void test02Pure2Default() { + String triggerTxid = + PublicMethed.triggerContract(mapKeyContract, "testPureToDefault()", "#", false, + 0, maxFeeLimit, contractExcAddress, contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + + Optional transactionInfo = PublicMethed + .getTransactionInfoById(triggerTxid, blockingStubFull); + Assert.assertEquals(0, transactionInfo.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.SUCCESS, + transactionInfo.get().getReceipt().getResult()); + Assert.assertEquals(13, + ByteArray.toInt(transactionInfo.get().getContractResult(0).substring(0, 32).toByteArray())); + Assert.assertEquals(23, + ByteArray.toInt(transactionInfo.get().getContractResult(0) + .substring(32, 64).toByteArray())); + + } + + @Test(enabled = true, description = "function array pure to view ") + public void test03Pure2View() { + String triggerTxid = + PublicMethed.triggerContract(mapKeyContract, "testPureToView()", "#", false, + 0, maxFeeLimit, contractExcAddress, contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + + Optional transactionInfo = PublicMethed + .getTransactionInfoById(triggerTxid, blockingStubFull); + Assert.assertEquals(0, transactionInfo.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.SUCCESS, + transactionInfo.get().getReceipt().getResult()); + Assert.assertEquals(13, + ByteArray.toInt(transactionInfo.get().getContractResult(0).substring(0, 32).toByteArray())); + Assert.assertEquals(23, + ByteArray.toInt(transactionInfo.get().getContractResult(0) + .substring(32, 64).toByteArray())); + } + + + /** + * constructor. + */ + @AfterClass + public void shutdown() throws InterruptedException { + PublicMethed.freedResource(contractExcAddress, contractExcKey, + testNetAccountAddress, blockingStubFull); + if (channelFull != null) { + channelFull.shutdown().awaitTermination(5, TimeUnit.SECONDS); + } + } + + +} + diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/NewFeatureForSolc086.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/NewFeatureForSolc086.java new file mode 100644 index 00000000000..84929452efa --- /dev/null +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/NewFeatureForSolc086.java @@ -0,0 +1,294 @@ +package stest.tron.wallet.dailybuild.tvmnewcommand.newGrammar; + +import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; +import java.util.HashMap; +import java.util.Optional; +import java.util.concurrent.TimeUnit; +import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Test; +import org.tron.api.GrpcAPI; +import org.tron.api.WalletGrpc; +import org.tron.common.crypto.ECKey; +import org.tron.common.utils.ByteArray; +import org.tron.common.utils.Utils; +import org.tron.core.Wallet; +import org.tron.protos.Protocol; +import org.tron.protos.contract.SmartContractOuterClass; +import stest.tron.wallet.common.client.Configuration; +import stest.tron.wallet.common.client.Parameter; +import stest.tron.wallet.common.client.utils.PublicMethed; + + + + +@Slf4j +public class NewFeatureForSolc086 { + + private final String testNetAccountKey = Configuration.getByPath("testng.conf") + .getString("foundationAccount.key2"); + private final byte[] testNetAccountAddress = PublicMethed.getFinalAddress(testNetAccountKey); + byte[] mapKeyContract = null; + ECKey ecKey1 = new ECKey(Utils.getRandom()); + byte[] contractExcAddress = ecKey1.getAddress(); + String contractExcKey = ByteArray.toHexString(ecKey1.getPrivKeyBytes()); + private Long maxFeeLimit = Configuration.getByPath("testng.conf") + .getLong("defaultParameter.maxFeeLimit"); + private ManagedChannel channelFull = null; + private WalletGrpc.WalletBlockingStub blockingStubFull = null; + + private String fullnode = Configuration.getByPath("testng.conf") + .getStringList("fullnode.ip.list").get(0); + + @BeforeSuite + public void beforeSuite() { + Wallet wallet = new Wallet(); + Wallet.setAddressPreFixByte(Parameter.CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); + } + + /** + * constructor. + */ + + @BeforeClass(enabled = true) + public void beforeClass() { + PublicMethed.printAddress(contractExcKey); + channelFull = ManagedChannelBuilder.forTarget(fullnode) + .usePlaintext(true) + .build(); + blockingStubFull = WalletGrpc.newBlockingStub(channelFull); + + Assert.assertTrue(PublicMethed + .sendcoin(contractExcAddress, 300100_000_000L, + testNetAccountAddress, testNetAccountKey, blockingStubFull)); + PublicMethed.waitProduceNextBlock(blockingStubFull); + + String filePath = "src/test/resources/soliditycode/NewFeature086.sol"; + String contractName = "C"; + HashMap retMap = PublicMethed.getBycodeAbi(filePath, contractName); + + String code = retMap.get("byteCode").toString(); + String abi = retMap.get("abI").toString(); + mapKeyContract = PublicMethed.deployContract(contractName, abi, code, "", maxFeeLimit, + 500000000L, 100, null, contractExcKey, + contractExcAddress, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + SmartContractOuterClass.SmartContract smartContract = PublicMethed.getContract(mapKeyContract, + blockingStubFull); + Assert.assertNotNull(smartContract.getAbi()); + } + + + @Test(enabled = true, description = "catch assert fail") + public void test01TrtCatchAssertFail() { + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(mapKeyContract, + "catchAssertFail()", "#", true, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + int trueRes = ByteArray.toInt(transactionExtention.getConstantResult(0).toByteArray()); + Assert.assertEquals(true, transactionExtention.getResult().getResult()); + Assert.assertEquals("SUCESS", + transactionExtention.getTransaction().getRet(0).getRet().toString()); + Assert.assertEquals(1, trueRes); + + } + + @Test(enabled = true, description = "catch under flow") + public void test02CatchUnderFlow() { + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(mapKeyContract, + "catchUnderFlow()", "#", true, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + int trueRes = ByteArray.toInt(transactionExtention.getConstantResult(0).toByteArray()); + Assert.assertEquals(true, transactionExtention.getResult().getResult()); + Assert.assertEquals("SUCESS", + transactionExtention.getTransaction().getRet(0).getRet().toString()); + Assert.assertEquals(17, trueRes); + + } + + @Test(enabled = true, description = "catch divide zero") + public void test03CatchDivideZero() { + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(mapKeyContract, + "catchDivideZero()", "#", true, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + int trueRes = ByteArray.toInt(transactionExtention.getConstantResult(0).toByteArray()); + Assert.assertEquals(true, transactionExtention.getResult().getResult()); + Assert.assertEquals("SUCESS", + transactionExtention.getTransaction().getRet(0).getRet().toString()); + Assert.assertEquals(18, trueRes); + } + + @Test(enabled = true, description = "get address code length") + public void test04GetAddressCodeLength() { + String triggerTxid = PublicMethed.triggerContract(mapKeyContract, "getAddressCodeLength()", + "#", false, 0, maxFeeLimit, contractExcAddress, contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + + Optional transactionInfo = PublicMethed + .getTransactionInfoById(triggerTxid, blockingStubFull); + Assert.assertEquals(0, transactionInfo.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.SUCCESS, + transactionInfo.get().getReceipt().getResult()); + Assert.assertTrue(transactionInfo.get().getFee() < 40000); + } + + @Test(enabled = true, description = "fix kecca256 bug: differt length return same code") + public void test05Kecca256BugFix() { + String args = "\"abcd123\""; + String triggerTxid = PublicMethed.triggerContract(mapKeyContract, "keccak256Bug(string)", + args, false, 0, maxFeeLimit, contractExcAddress, contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + + Optional transactionInfo = PublicMethed + .getTransactionInfoById(triggerTxid, blockingStubFull); + Assert.assertEquals(0, transactionInfo.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.SUCCESS, + transactionInfo.get().getReceipt().getResult()); + Assert.assertEquals(0, + ByteArray.toInt(transactionInfo.get().getContractResult(0).toByteArray())); + logger.info(transactionInfo.toString()); + } + + @Test(enabled = true, description = "revert error type with params") + public void test06RevertErrorType() { + String args = "\"T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb\",1000000000"; + String triggerTxid = PublicMethed.triggerContract(mapKeyContract, "transfer(address,uint256)", + args, false, 0, maxFeeLimit, contractExcAddress, contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + + Optional transactionInfo = PublicMethed + .getTransactionInfoById(triggerTxid, blockingStubFull); + logger.info(transactionInfo.toString()); + Assert.assertEquals(1, transactionInfo.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.REVERT, + transactionInfo.get().getReceipt().getResult()); + Assert.assertEquals("cf479181", + ByteArray.toHexString(transactionInfo.get() + .getContractResult(0).substring(0, 4).toByteArray())); + Assert.assertEquals("0000000000000000000000000000000000000000000000000000000000000000", + ByteArray.toHexString(transactionInfo.get().getContractResult(0) + .substring(4, 36).toByteArray())); + Assert.assertEquals("000000000000000000000000000000000000000000000000000000003b9aca00", + ByteArray.toHexString(transactionInfo.get().getContractResult(0) + .substring(36, 68).toByteArray())); + + } + + @Test(enabled = true, description = "revert error type no params") + public void test07RevertErrorType() { + String triggerTxid = PublicMethed.triggerContract(mapKeyContract, "withdraw()", "#", false, + 0, maxFeeLimit, contractExcAddress, contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + + Optional transactionInfo = PublicMethed + .getTransactionInfoById(triggerTxid, blockingStubFull); + Assert.assertEquals(1, transactionInfo.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.REVERT, + transactionInfo.get().getReceipt().getResult()); + Assert.assertEquals("82b42900", + ByteArray.toHexString(transactionInfo.get().getContractResult(0) + .substring(0, 4).toByteArray())); + } + + @Test(enabled = true, description = "test bytes concat") + public void test08bytesConcat() { + String args = "\"0x1234\",\"p2\",\"0x48e2f56f2c57e3532146eef2587a2a72\""; + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(mapKeyContract, + "bytesConcat(bytes,string,bytes16)", args, false, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + Assert.assertEquals(true, transactionExtention.getResult().getResult()); + Assert.assertEquals("SUCESS", + transactionExtention.getTransaction().getRet(0).getRet().toString()); + int trueRes = ByteArray.toInt(transactionExtention.getConstantResult(0).toByteArray()); + Assert.assertEquals(36, trueRes); + } + + @Test(enabled = true, description = "test emit event") + public void test09EmitEvent() { + String triggerTxid = PublicMethed.triggerContract(mapKeyContract, "testEmitEvent()", "#", false, + 0, maxFeeLimit, contractExcAddress, contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + + Optional transactionInfo = PublicMethed + .getTransactionInfoById(triggerTxid, blockingStubFull); + logger.info(transactionInfo.toString()); + Assert.assertEquals(0, transactionInfo.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.SUCCESS, + transactionInfo.get().getReceipt().getResult()); + Assert.assertEquals(6, + ByteArray.toInt(transactionInfo.get().getLog(0).getData().toByteArray())); + } + + + @Test(enabled = true, description = "test bytes convert to byteN overflow") + public void test10Bytes2ByteN() { + String args = "\"0x12345678\""; + String triggerTxid = PublicMethed.triggerContract(mapKeyContract, "bytes2BytesN(bytes)", + args, false, 0, maxFeeLimit, contractExcAddress, contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + + Optional transactionInfo = PublicMethed + .getTransactionInfoById(triggerTxid, blockingStubFull); + logger.info(transactionInfo.toString()); + Assert.assertEquals(0, transactionInfo.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.SUCCESS, + transactionInfo.get().getReceipt().getResult()); + Assert.assertEquals("1234560000000000000000000000000000000000000000000000000000000000", + ByteArray.toHexString(transactionInfo.get().getContractResult(0).toByteArray())); + } + + @Test(enabled = true, description = "test bytes convert to byteN underflow") + public void test11Bytes2ByteN() { + String args = "\"0x1234\""; + String triggerTxid = PublicMethed.triggerContract(mapKeyContract, "bytes2BytesN(bytes)", + args, false, 0, maxFeeLimit, contractExcAddress, contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + + Optional transactionInfo = PublicMethed + .getTransactionInfoById(triggerTxid, blockingStubFull); + logger.info(transactionInfo.toString()); + Assert.assertEquals(0, transactionInfo.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.SUCCESS, + transactionInfo.get().getReceipt().getResult()); + Assert.assertEquals("1234000000000000000000000000000000000000000000000000000000000000", + ByteArray.toHexString(transactionInfo.get().getContractResult(0).toByteArray())); + } + + @Test(enabled = true, description = "get contract address by different function") + public void test12GetConcatAddress() { + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(mapKeyContract, + "getContractAddress()", "#", false, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + Assert.assertEquals(true, transactionExtention.getResult().getResult()); + Assert.assertEquals("SUCESS", + transactionExtention.getTransaction().getRet(0).getRet().toString()); + String res1 = ByteArray.toHexString(transactionExtention.getConstantResult(0) + .substring(0, 32).toByteArray()); + String res2 = ByteArray.toHexString(transactionExtention.getConstantResult(0) + .substring(32, 64).toByteArray()); + Assert.assertEquals(res1, res2); + } + + /** + * constructor. + */ + @AfterClass + public void shutdown() throws InterruptedException { + PublicMethed.freedResource(contractExcAddress, contractExcKey, + testNetAccountAddress, blockingStubFull); + if (channelFull != null) { + channelFull.shutdown().awaitTermination(5, TimeUnit.SECONDS); + } + } + + +} + diff --git a/framework/src/test/resources/soliditycode/NewFeature086.sol b/framework/src/test/resources/soliditycode/NewFeature086.sol new file mode 100644 index 00000000000..fd4f2774438 --- /dev/null +++ b/framework/src/test/resources/soliditycode/NewFeature086.sol @@ -0,0 +1,115 @@ +contract C { + constructor() public payable{} + + function catchAssertFail() external view returns(uint) { + try this.assertFail() { + return 0; + } catch Panic(uint _code) { + if (_code == 0x01) { + return 0x01; + } + return 2; + } + return 3; + } + function assertFail() external pure { + assert(0 == 1); + } + function catchUnderFlow() external view returns(uint) { + try this.underflow() { + return 44; + } catch Panic(uint _code) { + if (_code == 0x11) { + return 0x11; + } + return 22; + } + return 33; + } + function underflow() public pure { + uint x = 0; + x--; + } + + function catchDivideZero() external view returns(uint) { + try this.divideZero() { + return 14; + } catch Panic(uint _code) { + if (_code == 0x12) { + return 0x12; + } + return 11; + } + return 13; + } + function divideZero() public pure { + uint8 x = 0; + uint8 y = 1; + uint8 z = y/x; + } + + function convertUint2Int() public pure { + uint16 a = 1; +// int32 b = int32(a); +// int32 b = a; + } + + function getAddressCodeLength() public returns(uint) { + return address(this).code.length; + } + + function keccak256Bug(string memory s) public returns (bool ret) { + assembly { + let a := keccak256(s, 32) + let b := keccak256(s, 8) + ret := eq(a, b) + } + } + + error InsufficientBalance(uint256 available, uint256 required); + mapping(address => uint) balance; + function transfer(address to, uint256 amount) public { + if (amount > balance[msg.sender]) + revert InsufficientBalance({available: balance[msg.sender], required: amount}); + balance[msg.sender] -= amount; + balance[to] += amount; + } + + error Unauthorized(); + function withdraw() public { + address payable owner; + if (msg.sender != owner) + revert Unauthorized(); + owner.transfer(address(this).balance); + } + + bytes s = "Storage"; + function bytesConcat(bytes calldata c, string memory m, bytes16 b) public view returns(uint256) { + bytes memory a = bytes.concat(s, c, c[:2], "Literal", bytes(m), b); + assert((s.length + c.length + 2 + 7 + bytes(m).length + 16) == a.length); + return a.length; + } + + event ssoo(uint256); + function testEmitEvent() public payable { + emit ssoo(6); + } + + function bytes2BytesN(bytes memory c) public returns (bytes8) { + // If c is longer than 8 bytes, truncation happens + return bytes3(c); + } + + function getContractAddress() public view returns (address a1, address a2) { + a1 = address(this); + this.getContractAddress.address; + [this.getContractAddress.address][0]; + a2 = [this.getContractAddress.address][0]; + } + +} + + + + + diff --git a/framework/src/test/resources/soliditycode/abstractContractWithMapParamsConstructor.sol b/framework/src/test/resources/soliditycode/abstractContractWithMapParamsConstructor.sol new file mode 100644 index 00000000000..380c57180b8 --- /dev/null +++ b/framework/src/test/resources/soliditycode/abstractContractWithMapParamsConstructor.sol @@ -0,0 +1,23 @@ +abstract contract Feline { + + constructor (mapping (uint => uint) storage m) { + m[5] = 20; + } + + function utterance() public virtual returns (bytes32); + + function getContractName() public returns (string memory){ + return "Feline"; + } +} + + +contract Cat is Feline { + mapping (uint => uint) public m; + + constructor() Feline(m) { + } + function utterance() public override returns (bytes32) { return "miaow"; } + function getMapValue() public returns (uint) { return m[5]; } + +} \ No newline at end of file diff --git a/framework/src/test/resources/soliditycode/function_type_array_to_storage.sol b/framework/src/test/resources/soliditycode/function_type_array_to_storage.sol new file mode 100644 index 00000000000..a2093023d6a --- /dev/null +++ b/framework/src/test/resources/soliditycode/function_type_array_to_storage.sol @@ -0,0 +1,45 @@ +contract C { + constructor() public payable{} + function () external returns(uint)[1] externalDefaultArray; + function () external view returns(uint)[1] externalViewArray; + function () external pure returns(uint)[1] externalPureArray; + + function () internal returns(uint)[1] internalDefaultArray; + function () internal view returns(uint)[1] internalViewArray; + function () internal pure returns(uint)[1] internalPureArray; + + function externalDefault() external returns(uint) { return 11; } + function externalView() external view returns(uint) { return 12; } + function externalPure() external pure returns(uint) { return 13; } + + function internalDefault() internal returns(uint) { return 21; } + function internalView() internal view returns(uint) { return 22; } + function internalPure() internal pure returns(uint) { return 23; } + + function testViewToDefault() public returns (uint, uint) { + externalDefaultArray = [this.externalView]; + internalDefaultArray = [internalView]; + + return (externalDefaultArray[0](), internalDefaultArray[0]()); + } + + function testPureToDefault() public returns (uint, uint) { + externalDefaultArray = [this.externalPure]; + internalDefaultArray = [internalPure]; + + return (externalDefaultArray[0](), internalDefaultArray[0]()); + } + + function testPureToView() public returns (uint, uint) { + externalViewArray = [this.externalPure]; + internalViewArray = [internalPure]; + + return (externalViewArray[0](), internalViewArray[0]()); + } +} +// ==== +// compileViaYul: also +// ---- +// testViewToDefault() -> 12, 22 +// testPureToDefault() -> 13, 23 +// testPureToView() -> 13, 23 diff --git a/framework/src/test/resources/soliditycode/super_skip_unimplemented_in_abstract_contract.sol b/framework/src/test/resources/soliditycode/super_skip_unimplemented_in_abstract_contract.sol new file mode 100644 index 00000000000..82dc5d513f7 --- /dev/null +++ b/framework/src/test/resources/soliditycode/super_skip_unimplemented_in_abstract_contract.sol @@ -0,0 +1,22 @@ +contract A { + function f() public virtual returns (uint) { + return 42; + } +} + +abstract contract I { + function f() external virtual returns (uint); +} + +contract B is A, I { + function f() override(A, I) public returns (uint) { + // I.f() is before A.f() in the C3 linearized order + // but it has no implementation. + return super.f(); + } +} +// ==== +// compileToEwasm: also +// compileViaYul: also +// ---- +// f() -> 42 From 2897dd247329f70cb7f5fba0c6b65827d1b112c5 Mon Sep 17 00:00:00 2001 From: liukai Date: Fri, 6 Aug 2021 16:10:08 +0800 Subject: [PATCH 090/341] add input direct param --- start.sh | 82 +++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 58 insertions(+), 24 deletions(-) diff --git a/start.sh b/start.sh index bd58fd2d036..9cc5546a876 100644 --- a/start.sh +++ b/start.sh @@ -1,13 +1,14 @@ #!/bin/bash APP=$1 -MANIFEST_OPT=$2 ALL_OPT=$* NEED_REBUILD=0 +ALL_ARR_OPT=($@) +ALL_OPT_NUM=$# if [[ $1 == '--rewrite--manifest' ]] || [[ $1 == '--r' ]] ; then APP='' NEED_REBUILD=1 - elif [[ $1 == '--rewrite--manifest' ]] || [[ $1 == '--r' ]] ; then + elif [[ $2 == '--rewrite--manifest' ]] || [[ $2 == '--r' ]] ; then NEED_REBUILD=1 fi @@ -17,10 +18,19 @@ rebuildManifest() { fi } - buildManifest() { ARCHIVE_JAR='ArchiveManifest.jar' - java -jar $ARCHIVE_JAR $ALL_OPT + if [[ -f $archive_jar ]] ; then + java -jar $archive_jar $all_opt + else + echo 'download archivemanifest.jar' + download=`wget https://github.com/tronprotocol/java-tron/releases/download/greatvoyage-v4.3.0/archivemanifest.jar` + if [[ $download == 0 ]] ; then + echo 'download success, rebuild manifest' + java -jar $archive_jar $all_opt + fi + fi + ret=$? if [[ $ret == 0 ]] ; then echo 'rebuild manifest success' @@ -30,25 +40,49 @@ buildManifest() { return ret } -checkMemory() { - ALLOW_MEMORY=16000000 - ALLOW_MAX_MEMORY=32000000 - MAX_MATESPACE_SIZE=' -XX:MaxMetaspaceSize=512m ' - total=`cat /proc/meminfo |grep MemTotal |awk -F ' ' '{print $2}'` - # total < ALLOW_MEN - if [ $total -lt $ALLOW_MEMORY ] ; then - echo "Direct memory must be greater than $ALLOW_MEMORY!, current memory: $total!!" - exit - fi - if [[ $total -gt $ALLOW_MEMORY ]] && [[ $total -lt $ALLOW_MAX_MEMORY ]] ; then -echo 1 $total - MAX_NEW_SIZE=' -XX:NewSize=3072m -XX:MaxNewSize=3072m ' - MEM_OPT="$MAX_MATESPACE_SIZE $MAX_NEW_SIZE" - - elif [[ $total -gt $ALLOW_MEMORY ]] ; then -echo 2 $total - NEW_RATIO=' -XX:NewSize=6144m -XX:MaxNewSize=6144m ' - MEM_OPT="$MAX_MATESPACE_SIZE $NEW_RATIO" +checkmemory() { + allow_memory=8000000 + allow_max_memory=48000000 + max_matespace_size=' -xx:maxmetaspacesize=512m ' + total=`cat /proc/meminfo |grep memtotal |awk -f ' ' '{print $2}'` + default_memory=true + + position=0 + for param in $ALL_ARR_OPT + do + if [[ $param == '-mem' ]]; then + arr_index=$[position+1] + memory=${ALL_ARR_OPT[position+1]} + echo 'input direct memory:' $memory'MB' + memory=$[memory * 1000] + if [[ $memory =~ ^[0-9]*$ ]] && [[ $memory -gt $allow_memory ]]; then + allow_memory=$memory + default_memory=false + else + echo "direct memory must be greater than1111 $allow_memory!, current memory: $total!!" + fi + fi + position=$[position+1] + done + + if [ $default_memory == true ]; then + # total < allow_mem + if [ $total -lt $allow_memory ] ; then + echo "direct memory must be greater than $allow_memory!, current memory: $total!!" + exit + fi + if [[ $total -gt $allow_memory ]] && [[ $total -lt $allow_max_memory ]] ; then + MAX_NEW_SIZE=' -XX:NewSize=3072m -XX:MaxNewSize=3072m ' + MEM_OPT="$max_matespace_size $max_new_size" + + elif [[ $total -gt $allow_memory ]] ; then + NEW_RATIO=' -XX:NewSize=6144m -XX:MaxNewSize=6144m ' + MEM_OPT="$max_matespace_size $new_ratio" + fi +else + NEW_RATIO=2 + max_matespace_size=$allow_memory / 16 + MEM_OPT="$max_matespace_size $new_ratio" fi } @@ -134,5 +168,5 @@ else exit -1 fi sleep 5 -checkMemory +checkmemory startService From 181173df1fa1fc6e51c2e4a0af389486f5a5d53d Mon Sep 17 00:00:00 2001 From: "federico.zhen" Date: Fri, 6 Aug 2021 18:21:29 +0800 Subject: [PATCH 091/341] add the unit tests for proposals --- .../core/actuator/utils/ProposalUtilTest.java | 60 ++++++++++++++++++- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java b/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java index dfd2e6fc364..799b9f854d1 100644 --- a/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java +++ b/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java @@ -1,6 +1,10 @@ package org.tron.core.actuator.utils; +import com.google.protobuf.ByteString; import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import lombok.extern.slf4j.Slf4j; import org.junit.AfterClass; import org.junit.Assert; @@ -9,10 +13,12 @@ import org.tron.common.application.Application; import org.tron.common.application.ApplicationFactory; import org.tron.common.application.TronApplicationContext; +import org.tron.common.utils.ByteArray; import org.tron.common.utils.FileUtil; import org.tron.common.utils.ForkController; import org.tron.core.Constant; import org.tron.core.config.DefaultConfig; +import org.tron.core.config.Parameter.ForkBlockVersionEnum; import org.tron.core.config.args.Args; import org.tron.core.db.Manager; import org.tron.core.exception.ContractValidateException; @@ -83,7 +89,7 @@ public void validProposalTypeCheck() throws ContractValidateException { public void validateCheck() { ProposalUtil actuatorUtil = new ProposalUtil(); DynamicPropertiesStore dynamicPropertiesStore = null; - ForkController forkUtils = null; + ForkController forkUtils = ForkController.instance(); long invalidValue = -1; try { @@ -299,6 +305,56 @@ public void validateCheck() { + "before [ALLOW_TVM_TRANSFER_TRC10] can be proposed", e.getMessage()); } - } + forkUtils.init(dbManager.getChainBaseManager()); + long maintenanceTimeInterval = forkUtils.getManager().getDynamicPropertiesStore() + .getMaintenanceTimeInterval(); + long hardForkTime = + ((ForkBlockVersionEnum.VERSION_4_0_1.getHardForkTime() - 1) / maintenanceTimeInterval + 1) + * maintenanceTimeInterval; + forkUtils.getManager().getDynamicPropertiesStore() + .saveLatestBlockHeaderTimestamp(hardForkTime + 1); + byte[] stats = new byte[27]; + Arrays.fill(stats, (byte) 1); + forkUtils.getManager().getDynamicPropertiesStore() + .statsByVersion(ForkBlockVersionEnum.VERSION_4_0_1.getValue(), stats); + ByteString address = ByteString + .copyFrom(ByteArray.fromHexString("a0ec6525979a351a54fa09fea64beb4cce33ffbb7a")); + List w = new ArrayList<>(); + w.add(address); + forkUtils.getManager().getWitnessScheduleStore().saveActiveWitnesses(w); + try { + actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalType.ALLOW_SHIELDED_TRC20_TRANSACTION + .getCode(), 2); + Assert.assertTrue(false); + } catch (ContractValidateException e) { + Assert.assertEquals("This value[ALLOW_SHIELDED_TRC20_TRANSACTION] is only allowed" + + " to be 1 or 0", e.getMessage()); + } + hardForkTime = + ((ForkBlockVersionEnum.VERSION_4_3.getHardForkTime() - 1) / maintenanceTimeInterval + 1) + * maintenanceTimeInterval; + forkUtils.getManager().getDynamicPropertiesStore() + .saveLatestBlockHeaderTimestamp(hardForkTime + 1); + forkUtils.getManager().getDynamicPropertiesStore() + .statsByVersion(ForkBlockVersionEnum.VERSION_4_3.getValue(), stats); + try { + actuatorUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.FREE_NET_LIMIT + .getCode(), -1); + Assert.assertTrue(false); + } catch (ContractValidateException e) { + Assert.assertEquals("Bad chain parameter value, valid range is [0,100_000]", + e.getMessage()); + } + + try { + actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalType.TOTAL_NET_LIMIT.getCode(), -1); + Assert.assertTrue(false); + } catch (ContractValidateException e) { + Assert.assertEquals("Bad chain parameter value, valid range is [0, 1_000_000_000_000L]", + e.getMessage()); + } + } } From c0085b63ad89dcc0f3c6e1d670e5e88240214472 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Mon, 9 Aug 2021 11:37:48 +0800 Subject: [PATCH 092/341] opt generate and broadcast block logic --- .../tron/core/consensus/BlockHandleImpl.java | 2 +- .../main/java/org/tron/core/db/Manager.java | 12 ++-------- .../org/tron/core/net/TronNetDelegate.java | 7 ++---- .../net/messagehandler/BlockMsgHandler.java | 23 +++++++++++++------ 4 files changed, 21 insertions(+), 23 deletions(-) diff --git a/framework/src/main/java/org/tron/core/consensus/BlockHandleImpl.java b/framework/src/main/java/org/tron/core/consensus/BlockHandleImpl.java index aafafd845d5..53e029cbab6 100644 --- a/framework/src/main/java/org/tron/core/consensus/BlockHandleImpl.java +++ b/framework/src/main/java/org/tron/core/consensus/BlockHandleImpl.java @@ -51,8 +51,8 @@ public BlockCapsule produce(Miner miner, long blockTime, long timeout) { consensus.receiveBlock(blockCapsule); BlockMessage blockMessage = new BlockMessage(blockCapsule); tronNetService.fastForward(blockMessage); - manager.pushBlock(blockCapsule); tronNetService.broadcast(blockMessage); + manager.pushBlock(blockCapsule); } catch (Exception e) { logger.error("Handle block {} failed.", blockCapsule.getBlockId().getString(), e); return null; diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 295d169a9e4..e5e09f79850 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -980,16 +980,8 @@ public List getVerifyTxs(BlockCapsule block) { } public boolean validBlock(final BlockCapsule block) throws ValidateSignatureException { - if (!block.validateSignature(chainBaseManager.getDynamicPropertiesStore(), - chainBaseManager.getAccountStore())) { - logger.warn("Validate signature failed. {}", block.getInstance()); - return false; - } - if (!consensus.validBlock(block)) { - logger.warn("Validate witness failed. {}", block.getInstance()); - return false; - } - return true; + return block.validateSignature(chainBaseManager.getDynamicPropertiesStore(), + chainBaseManager.getAccountStore()) && consensus.validBlock(block); } /** diff --git a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java index 6c6296244cb..58a47c24581 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java +++ b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java @@ -261,12 +261,9 @@ public void pushTransaction(TransactionCapsule trx) throws P2pException { } } - public void validBlock(BlockCapsule block) throws P2pException { + public boolean validBlock(BlockCapsule block) throws P2pException { try { - if (dbManager.validBlock(block)) { - throw new P2pException(TypeEnum.BAD_BLOCK, - "Valid block failed: " + block.getBlockId().toString()); - } + return dbManager.validBlock(block); } catch (ValidateSignatureException e) { throw new P2pException(TypeEnum.BAD_BLOCK, e); } diff --git a/framework/src/main/java/org/tron/core/net/messagehandler/BlockMsgHandler.java b/framework/src/main/java/org/tron/core/net/messagehandler/BlockMsgHandler.java index 2f922277cd0..a6e2ce6d3f3 100644 --- a/framework/src/main/java/org/tron/core/net/messagehandler/BlockMsgHandler.java +++ b/framework/src/main/java/org/tron/core/net/messagehandler/BlockMsgHandler.java @@ -112,17 +112,26 @@ private void processBlock(PeerConnection peer, BlockCapsule block) throws P2pExc return; } - tronNetDelegate.validBlock(block); - - if (fastForward) { - advService.fastForward(new BlockMessage(block)); - tronNetDelegate.trustNode(peer); - } else { - advService.broadcast(new BlockMessage(block)); + boolean flag = tronNetDelegate.validBlock(block); + if (flag) { + if (fastForward) { + advService.fastForward(new BlockMessage(block)); + tronNetDelegate.trustNode(peer); + } else { + advService.broadcast(new BlockMessage(block)); + } } try { tronNetDelegate.processBlock(block, false); + if (!flag) { + if (fastForward) { + advService.fastForward(new BlockMessage(block)); + tronNetDelegate.trustNode(peer); + } else { + advService.broadcast(new BlockMessage(block)); + } + } witnessProductBlockService.validWitnessProductTwoBlock(block); From 04e46474cec95d10fbe539c99852cc5a0bf115cb Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Mon, 9 Aug 2021 12:06:31 +0800 Subject: [PATCH 093/341] feat: use fail instead of assertTrue(false) --- .../tron/core/actuator/utils/ProposalUtilTest.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java b/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java index 799b9f854d1..1ad57367fdd 100644 --- a/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java +++ b/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java @@ -323,10 +323,10 @@ public void validateCheck() { w.add(address); forkUtils.getManager().getWitnessScheduleStore().saveActiveWitnesses(w); try { - actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.ALLOW_SHIELDED_TRC20_TRANSACTION .getCode(), 2); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals("This value[ALLOW_SHIELDED_TRC20_TRANSACTION] is only allowed" + " to be 1 or 0", e.getMessage()); @@ -340,18 +340,18 @@ public void validateCheck() { forkUtils.getManager().getDynamicPropertiesStore() .statsByVersion(ForkBlockVersionEnum.VERSION_4_3.getValue(), stats); try { - actuatorUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.FREE_NET_LIMIT + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.FREE_NET_LIMIT .getCode(), -1); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals("Bad chain parameter value, valid range is [0,100_000]", e.getMessage()); } try { - actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.TOTAL_NET_LIMIT.getCode(), -1); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals("Bad chain parameter value, valid range is [0, 1_000_000_000_000L]", e.getMessage()); From d68e5465084cac92a55f77e0330940d6c15689ff Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Mon, 9 Aug 2021 12:47:44 +0800 Subject: [PATCH 094/341] fix: update transactionhash in log --- .../java/org/tron/core/services/jsonrpc/TransactionReceipt.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java index 6772cc4fa48..1e05519fb52 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java @@ -106,7 +106,7 @@ public TransactionReceipt(Protocol.Block block, TransactionInfo txInfo, Wallet w TransactionReceipt.TransactionLog transactionLog = new TransactionReceipt.TransactionLog(); // index is the index in the block transactionLog.logIndex = ByteArray.toJsonHex(index + cumulativeLogCount); - transactionLog.transactionHash = txid; + transactionLog.transactionHash = transactionHash; transactionLog.transactionIndex = transactionIndex; transactionLog.blockHash = blockHash; transactionLog.blockNumber = blockNumber; From ba503e1515dfecec75083a7cc6177a7056c5a5de Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Mon, 9 Aug 2021 14:46:41 +0800 Subject: [PATCH 095/341] feat: set data to 0x instead of null if no data in log --- .../org/tron/core/services/jsonrpc/TransactionReceipt.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java index 1e05519fb52..45493ea24cd 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java @@ -113,6 +113,10 @@ public TransactionReceipt(Protocol.Block block, TransactionInfo txInfo, Wallet w byte[] addressByte = convertToTronAddress(log.getAddress().toByteArray()); transactionLog.address = ByteArray.toJsonHexAddress(addressByte); transactionLog.data = ByteArray.toJsonHex(log.getData().toByteArray()); + if (transactionLog.data == null) { + transactionLog.data = "0x"; + } + String[] topics = new String[log.getTopicsCount()]; for (int i = 0; i < log.getTopicsCount(); i++) { topics[i] = ByteArray.toJsonHex(log.getTopics(i).toByteArray()); From d6c3cd0241c46c730a83e7450e27003572a3d8b2 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Mon, 9 Aug 2021 18:02:04 +0800 Subject: [PATCH 096/341] feat: set logsBloom to byte[256] --- .../java/org/tron/core/services/jsonrpc/TransactionReceipt.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java index 45493ea24cd..59ff35c784b 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java @@ -127,7 +127,7 @@ public TransactionReceipt(Protocol.Block block, TransactionInfo txInfo, Wallet w } logs = logList.toArray(new TransactionReceipt.TransactionLog[logList.size()]); - logsBloom = null; // no value + logsBloom = ByteArray.toJsonHex(new byte[256]); // no value root = null; } } \ No newline at end of file From b30905269afb167a52cf03e9e6333ff2ffc0cc9c Mon Sep 17 00:00:00 2001 From: "federico.zhen" Date: Fri, 6 Aug 2021 18:21:29 +0800 Subject: [PATCH 097/341] add the unit tests for proposals --- .../core/actuator/utils/ProposalUtilTest.java | 60 ++++++++++++++++++- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java b/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java index dfd2e6fc364..799b9f854d1 100644 --- a/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java +++ b/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java @@ -1,6 +1,10 @@ package org.tron.core.actuator.utils; +import com.google.protobuf.ByteString; import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import lombok.extern.slf4j.Slf4j; import org.junit.AfterClass; import org.junit.Assert; @@ -9,10 +13,12 @@ import org.tron.common.application.Application; import org.tron.common.application.ApplicationFactory; import org.tron.common.application.TronApplicationContext; +import org.tron.common.utils.ByteArray; import org.tron.common.utils.FileUtil; import org.tron.common.utils.ForkController; import org.tron.core.Constant; import org.tron.core.config.DefaultConfig; +import org.tron.core.config.Parameter.ForkBlockVersionEnum; import org.tron.core.config.args.Args; import org.tron.core.db.Manager; import org.tron.core.exception.ContractValidateException; @@ -83,7 +89,7 @@ public void validProposalTypeCheck() throws ContractValidateException { public void validateCheck() { ProposalUtil actuatorUtil = new ProposalUtil(); DynamicPropertiesStore dynamicPropertiesStore = null; - ForkController forkUtils = null; + ForkController forkUtils = ForkController.instance(); long invalidValue = -1; try { @@ -299,6 +305,56 @@ public void validateCheck() { + "before [ALLOW_TVM_TRANSFER_TRC10] can be proposed", e.getMessage()); } - } + forkUtils.init(dbManager.getChainBaseManager()); + long maintenanceTimeInterval = forkUtils.getManager().getDynamicPropertiesStore() + .getMaintenanceTimeInterval(); + long hardForkTime = + ((ForkBlockVersionEnum.VERSION_4_0_1.getHardForkTime() - 1) / maintenanceTimeInterval + 1) + * maintenanceTimeInterval; + forkUtils.getManager().getDynamicPropertiesStore() + .saveLatestBlockHeaderTimestamp(hardForkTime + 1); + byte[] stats = new byte[27]; + Arrays.fill(stats, (byte) 1); + forkUtils.getManager().getDynamicPropertiesStore() + .statsByVersion(ForkBlockVersionEnum.VERSION_4_0_1.getValue(), stats); + ByteString address = ByteString + .copyFrom(ByteArray.fromHexString("a0ec6525979a351a54fa09fea64beb4cce33ffbb7a")); + List w = new ArrayList<>(); + w.add(address); + forkUtils.getManager().getWitnessScheduleStore().saveActiveWitnesses(w); + try { + actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalType.ALLOW_SHIELDED_TRC20_TRANSACTION + .getCode(), 2); + Assert.assertTrue(false); + } catch (ContractValidateException e) { + Assert.assertEquals("This value[ALLOW_SHIELDED_TRC20_TRANSACTION] is only allowed" + + " to be 1 or 0", e.getMessage()); + } + hardForkTime = + ((ForkBlockVersionEnum.VERSION_4_3.getHardForkTime() - 1) / maintenanceTimeInterval + 1) + * maintenanceTimeInterval; + forkUtils.getManager().getDynamicPropertiesStore() + .saveLatestBlockHeaderTimestamp(hardForkTime + 1); + forkUtils.getManager().getDynamicPropertiesStore() + .statsByVersion(ForkBlockVersionEnum.VERSION_4_3.getValue(), stats); + try { + actuatorUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.FREE_NET_LIMIT + .getCode(), -1); + Assert.assertTrue(false); + } catch (ContractValidateException e) { + Assert.assertEquals("Bad chain parameter value, valid range is [0,100_000]", + e.getMessage()); + } + + try { + actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalType.TOTAL_NET_LIMIT.getCode(), -1); + Assert.assertTrue(false); + } catch (ContractValidateException e) { + Assert.assertEquals("Bad chain parameter value, valid range is [0, 1_000_000_000_000L]", + e.getMessage()); + } + } } From 4bd08e66dd0855a750bc814cdbcce21638e2fc85 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Mon, 9 Aug 2021 12:06:31 +0800 Subject: [PATCH 098/341] feat: use fail instead of assertTrue(false) --- .../tron/core/actuator/utils/ProposalUtilTest.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java b/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java index 799b9f854d1..1ad57367fdd 100644 --- a/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java +++ b/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java @@ -323,10 +323,10 @@ public void validateCheck() { w.add(address); forkUtils.getManager().getWitnessScheduleStore().saveActiveWitnesses(w); try { - actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.ALLOW_SHIELDED_TRC20_TRANSACTION .getCode(), 2); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals("This value[ALLOW_SHIELDED_TRC20_TRANSACTION] is only allowed" + " to be 1 or 0", e.getMessage()); @@ -340,18 +340,18 @@ public void validateCheck() { forkUtils.getManager().getDynamicPropertiesStore() .statsByVersion(ForkBlockVersionEnum.VERSION_4_3.getValue(), stats); try { - actuatorUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.FREE_NET_LIMIT + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.FREE_NET_LIMIT .getCode(), -1); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals("Bad chain parameter value, valid range is [0,100_000]", e.getMessage()); } try { - actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.TOTAL_NET_LIMIT.getCode(), -1); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals("Bad chain parameter value, valid range is [0, 1_000_000_000_000L]", e.getMessage()); From f81ffc14bea715cc15646261ce541565e25763e7 Mon Sep 17 00:00:00 2001 From: sophiawang <1975054324@qq.com> Date: Wed, 11 Aug 2021 14:26:06 +0800 Subject: [PATCH 099/341] enable tvm vote cases --- .../tvmnewcommand/newGrammar/TvmVote.java | 70 ++++--------------- 1 file changed, 14 insertions(+), 56 deletions(-) diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/TvmVote.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/TvmVote.java index 0236d21bc60..9d450b0392f 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/TvmVote.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/TvmVote.java @@ -60,7 +60,7 @@ public void beforeSuite() { * constructor. */ - @BeforeClass(enabled = false) + @BeforeClass(enabled = true) public void beforeClass() { PublicMethed.printAddress(contractExcKey); channelFull = ManagedChannelBuilder.forTarget(fullnode) @@ -88,49 +88,7 @@ public void beforeClass() { Assert.assertNotNull(smartContract.getAbi()); } - @Test(enabled = false, description = "freeze balance and vote witness") - public void yty() { - String filePath = "src/test/resources/soliditycode/tvmVote.sol"; - String contractName = "TestVote"; - - HashMap retMap = PublicMethed.getBycodeAbi(filePath, contractName); - String code = retMap.get("byteCode").toString(); - String abi = retMap.get("abI").toString(); - final String transferTokenTxid = PublicMethed - .deployContractAndGetTransactionInfoById(contractName, abi, code, "", maxFeeLimit, - 0, 0, 10000, "0", 0, - null, contractExcKey, contractExcAddress, - blockingStubFull); - - PublicMethed.waitProduceNextBlock(blockingStubFull); - Optional infoById = PublicMethed - .getTransactionInfoById(transferTokenTxid, blockingStubFull); - - if (transferTokenTxid == null || infoById.get().getResultValue() != 0) { - Assert.fail("deploy transaction failed with message: " + infoById.get().getResMessage() - .toStringUtf8()); - } - - mapKeyContract = infoById.get().getContractAddress().toByteArray(); - - String methodStr = "freeze(address,uint256,uint256)"; - String receiverAdd = Base58.encode58Check(mapKeyContract); - String args = "\"" + receiverAdd + "\"," + freezeCount + ",1"; - logger.info("receiverAdd: " + receiverAdd); - logger.info("args: " + args); - String triggerTxid = PublicMethed - .triggerContract(mapKeyContract, methodStr, args, false, 0, - 1000000000L, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); - - PublicMethed.waitProduceNextBlock(blockingStubFull); - - infoById = PublicMethed.getTransactionInfoById(triggerTxid, blockingStubFull); - logger.info("infoById: " + infoById.toString()); - - - } - - @Test(enabled = false, description = "query reward balance") + @Test(enabled = true, description = "query reward balance") public void test01QueryRewardBalance() { GrpcAPI.TransactionExtention transactionExtention = PublicMethed .triggerConstantContractForExtention(mapKeyContract, @@ -148,7 +106,7 @@ public void test01QueryRewardBalance() { } - @Test(enabled = false, description = "freeze balance and vote witness") + @Test(enabled = true, description = "freeze balance and vote witness") public void test02VoteWitness() { String methodStr = "freeze(address,uint256,uint256)"; String receiverAdd = Base58.encode58Check(mapKeyContract); @@ -191,7 +149,7 @@ public void test02VoteWitness() { Assert.assertEquals(1, voteCount); } - @Test(enabled = false, description = "query contract address is Sr Candidate or not") + @Test(enabled = true, description = "query contract address is Sr Candidate or not") public void test03IsSrCandidate() { String args = "\"" + Base58.encode58Check(mapKeyContract) + "\""; GrpcAPI.TransactionExtention transactionExtention = PublicMethed @@ -203,7 +161,7 @@ public void test03IsSrCandidate() { Assert.assertEquals(0, 0); } - @Test(enabled = false, description = "query sr address is Sr Candidate or not") + @Test(enabled = true, description = "query sr address is Sr Candidate or not") public void test04IsSrCandidate() { String args = "\"" + Base58.encode58Check(witnessAddress) + "\""; GrpcAPI.TransactionExtention transactionExtention = PublicMethed @@ -215,7 +173,7 @@ public void test04IsSrCandidate() { Assert.assertEquals(1, 1); } - @Test(enabled = false, description = "query zero address is Sr Candidate or not") + @Test(enabled = true, description = "query zero address is Sr Candidate or not") public void test05IsSrCandidate() { String args = "\"T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb\""; GrpcAPI.TransactionExtention transactionExtention = PublicMethed @@ -227,7 +185,7 @@ public void test05IsSrCandidate() { Assert.assertEquals(0, 0); } - @Test(enabled = false, description = "query sr's total vote count") + @Test(enabled = true, description = "query sr's total vote count") public void test06querySrTotalVoteCount() { String args = "\"" + Base58.encode58Check(witnessAddress) + "\""; GrpcAPI.TransactionExtention transactionExtention = PublicMethed @@ -239,7 +197,7 @@ public void test06querySrTotalVoteCount() { Assert.assertEquals(0, trueRes); } - @Test(enabled = false, description = "query contract's total vote count") + @Test(enabled = true, description = "query contract's total vote count") public void test07queryContractTotalVoteCount() { String args = "\"" + Base58.encode58Check(mapKeyContract) + "\""; GrpcAPI.TransactionExtention transactionExtention = PublicMethed @@ -251,7 +209,7 @@ public void test07queryContractTotalVoteCount() { Assert.assertEquals(freezeCount / 1000000, trueRes); } - @Test(enabled = false, description = "query vote count") + @Test(enabled = true, description = "query vote count") public void test08queryVoteCount() { String from = Base58.encode58Check(mapKeyContract); String to = Base58.encode58Check(witnessAddress); @@ -265,7 +223,7 @@ public void test08queryVoteCount() { Assert.assertEquals(voteCount, trueRes); } - @Test(enabled = false, description = "query contract used vote count") + @Test(enabled = true, description = "query contract used vote count") public void test09queryUsedVoteCount() { String from = Base58.encode58Check(mapKeyContract); String args = "\"" + from + "\""; @@ -278,7 +236,7 @@ public void test09queryUsedVoteCount() { Assert.assertEquals(voteCount, trueRes); } - @Test(enabled = false, description = "query witnesses received vote count") + @Test(enabled = true, description = "query witnesses received vote count") public void test10queryReceivedVoteCount() { String witness = Base58.encode58Check(witnessAddress); String args = "\"" + witness + "\""; @@ -302,7 +260,7 @@ public void test10queryReceivedVoteCount() { Assert.assertEquals(trueRes, receiveCount); } - @Test(enabled = false, description = "withdraw reward") + @Test(enabled = true, description = "withdraw reward") public void test11WithdrawReward() { String methodStr = "withdrawReward()"; String triggerTxid = PublicMethed.triggerContract(mapKeyContract, methodStr, "#", false, @@ -321,7 +279,7 @@ public void test11WithdrawReward() { Assert.assertEquals("", internal.getCallValueInfo(0).toString()); } - @Test(enabled = false, description = "unfreeze energy") + @Test(enabled = true, description = "unfreeze energy") public void test12Unfreeze() { String methodStr = "unfreeze(address,uint256)"; String args = "\"" + Base58.encode58Check(mapKeyContract) + "\",1"; @@ -340,7 +298,7 @@ public void test12Unfreeze() { Assert.assertEquals(freezeCount, internal.getCallValueInfo(0).getCallValue()); } - @Test(enabled = false, description = "kill me") + @Test(enabled = true, description = "kill me") public void test13Suicide() { String methodStr = "killme(address)"; String args = "\"" + Base58.encode58Check(witnessAddress) + "\""; From d0a505218daed1c3134e5c29eee79e399eb6f41a Mon Sep 17 00:00:00 2001 From: wubin01 Date: Wed, 11 Aug 2021 16:59:05 +0800 Subject: [PATCH 100/341] opt block process logic --- .../src/main/java/org/tron/core/db/Manager.java | 5 ++--- .../main/java/org/tron/core/net/TronNetDelegate.java | 12 ++++++++++-- .../core/net/messagehandler/BlockMsgHandler.java | 3 +-- .../java/org/tron/core/net/service/SyncService.java | 1 + 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index e5e09f79850..b95a3c6c299 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -979,9 +979,8 @@ public List getVerifyTxs(BlockCapsule block) { return txs; } - public boolean validBlock(final BlockCapsule block) throws ValidateSignatureException { - return block.validateSignature(chainBaseManager.getDynamicPropertiesStore(), - chainBaseManager.getAccountStore()) && consensus.validBlock(block); + public boolean validWitness(final BlockCapsule block) { + return consensus.validBlock(block); } /** diff --git a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java index 58a47c24581..891fde9dad5 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java +++ b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java @@ -261,14 +261,22 @@ public void pushTransaction(TransactionCapsule trx) throws P2pException { } } - public boolean validBlock(BlockCapsule block) throws P2pException { + public void validSignature(BlockCapsule block) throws P2pException { try { - return dbManager.validBlock(block); + if (!block.validateSignature(dbManager.getDynamicPropertiesStore(), + dbManager.getAccountStore())) { + throw new P2pException(TypeEnum.BAD_BLOCK, "valid signature failed."); + } } catch (ValidateSignatureException e) { throw new P2pException(TypeEnum.BAD_BLOCK, e); } } + public boolean preValid(BlockCapsule block) throws P2pException { + validSignature(block); + return dbManager.validWitness(block); + } + public PbftSignCapsule getBlockPbftCommitData(long blockNum) { return chainBaseManager.getPbftSignDataStore().getBlockSignData(blockNum); } diff --git a/framework/src/main/java/org/tron/core/net/messagehandler/BlockMsgHandler.java b/framework/src/main/java/org/tron/core/net/messagehandler/BlockMsgHandler.java index a6e2ce6d3f3..06efc81d728 100644 --- a/framework/src/main/java/org/tron/core/net/messagehandler/BlockMsgHandler.java +++ b/framework/src/main/java/org/tron/core/net/messagehandler/BlockMsgHandler.java @@ -112,7 +112,7 @@ private void processBlock(PeerConnection peer, BlockCapsule block) throws P2pExc return; } - boolean flag = tronNetDelegate.validBlock(block); + boolean flag = tronNetDelegate.preValid(block); if (flag) { if (fastForward) { advService.fastForward(new BlockMessage(block)); @@ -127,7 +127,6 @@ private void processBlock(PeerConnection peer, BlockCapsule block) throws P2pExc if (!flag) { if (fastForward) { advService.fastForward(new BlockMessage(block)); - tronNetDelegate.trustNode(peer); } else { advService.broadcast(new BlockMessage(block)); } diff --git a/framework/src/main/java/org/tron/core/net/service/SyncService.java b/framework/src/main/java/org/tron/core/net/service/SyncService.java index a438d29a809..64a721bf014 100644 --- a/framework/src/main/java/org/tron/core/net/service/SyncService.java +++ b/framework/src/main/java/org/tron/core/net/service/SyncService.java @@ -263,6 +263,7 @@ private void processSyncBlock(BlockCapsule block) { boolean flag = true; BlockId blockId = block.getBlockId(); try { + tronNetDelegate.validSignature(block); tronNetDelegate.processBlock(block, true); pbftDataSyncHandler.processPBFTCommitData(block); } catch (Exception e) { From 0fc1aebc122375c8e4e5636b3bf02851af43dd41 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Wed, 11 Aug 2021 17:47:18 +0800 Subject: [PATCH 101/341] remore nouse test --- .../java/org/tron/core/db/ManagerTest.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/framework/src/test/java/org/tron/core/db/ManagerTest.java b/framework/src/test/java/org/tron/core/db/ManagerTest.java index 5b4f60d2e36..1afed82745d 100755 --- a/framework/src/test/java/org/tron/core/db/ManagerTest.java +++ b/framework/src/test/java/org/tron/core/db/ManagerTest.java @@ -232,20 +232,20 @@ public void GetterInstanceTest() { } - @Test - public void pushBlockInvalidSignature() { - // invalid witness address cause invalid signature - String invalidWitness = "bcab94c3e0c9214fb4ac7ff9d7d5a937d1f40031f"; - blockCapsule2.setWitness(invalidWitness); - try { - dbManager.pushBlock(blockCapsule2); - Assert.assertTrue(false); - } catch (BadBlockException e) { - Assert.assertEquals("The signature is not validated", e.getMessage()); - } catch (Exception e) { - Assert.assertFalse(e instanceof Exception); - } - } +// @Test +// public void pushBlockInvalidSignature() { +// // invalid witness address cause invalid signature +// String invalidWitness = "bcab94c3e0c9214fb4ac7ff9d7d5a937d1f40031f"; +// blockCapsule2.setWitness(invalidWitness); +// try { +// dbManager.pushBlock(blockCapsule2); +// Assert.assertTrue(false); +// } catch (BadBlockException e) { +// Assert.assertEquals("The signature is not validated", e.getMessage()); +// } catch (Exception e) { +// Assert.assertFalse(e instanceof Exception); +// } +// } @Test From 2396e8b29176f69e2a4a02dc13ec223e449011fc Mon Sep 17 00:00:00 2001 From: liukai Date: Wed, 11 Aug 2021 18:10:40 +0800 Subject: [PATCH 102/341] add test case of AssetUtilTest --- .../tron/core/capsule/AccountCapsuleTest.java | 1 - .../core/capsule/utils/AssetUtilTest.java | 104 ++++++++++++++++++ 2 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 framework/src/test/java/org/tron/core/capsule/utils/AssetUtilTest.java diff --git a/framework/src/test/java/org/tron/core/capsule/AccountCapsuleTest.java b/framework/src/test/java/org/tron/core/capsule/AccountCapsuleTest.java index 1558139ab73..e0a9e188b06 100644 --- a/framework/src/test/java/org/tron/core/capsule/AccountCapsuleTest.java +++ b/framework/src/test/java/org/tron/core/capsule/AccountCapsuleTest.java @@ -29,7 +29,6 @@ import org.tron.protos.Protocol.Vote; import org.tron.protos.contract.AssetIssueContractOuterClass.AssetIssueContract; -@Ignore public class AccountCapsuleTest { private static final String dbPath = "output_accountCapsule_test"; diff --git a/framework/src/test/java/org/tron/core/capsule/utils/AssetUtilTest.java b/framework/src/test/java/org/tron/core/capsule/utils/AssetUtilTest.java new file mode 100644 index 00000000000..bf1a5def893 --- /dev/null +++ b/framework/src/test/java/org/tron/core/capsule/utils/AssetUtilTest.java @@ -0,0 +1,104 @@ +/* + * java-tron is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * java-tron 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.tron.core.capsule.utils; + +import com.google.protobuf.ByteString; +import lombok.extern.slf4j.Slf4j; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.Test; +import org.tron.common.application.TronApplicationContext; +import org.tron.common.utils.ByteArray; +import org.tron.common.utils.FileUtil; +import org.tron.core.Constant; +import org.tron.core.capsule.AccountAssetCapsule; +import org.tron.core.capsule.AccountCapsule; +import org.tron.core.config.DefaultConfig; +import org.tron.core.config.args.Args; +import org.tron.core.db.Manager; +import org.tron.core.store.AccountAssetStore; +import org.tron.protos.Protocol; + +import java.io.File; +import java.util.Random; + +@Slf4j +public class AssetUtilTest { + + private static String dbPath = "output_AssetUtil_test"; + private static Manager dbManager; + private static TronApplicationContext context; + + static { + Args.setParam(new String[]{"-d", dbPath, "-w"}, Constant.TEST_CONF); + context = new TronApplicationContext(DefaultConfig.class); + dbManager = context.getBean(Manager.class); + } + + @AfterClass + public static void removeDb() { + Args.clearParam(); + FileUtil.deleteDir(new File(dbPath)); + } + + public static byte[] randomBytes(int length) { + //generate the random number + byte[] result = new byte[length]; + new Random().nextBytes(result); + return result; + } + + private static AccountCapsule createAccount() { + com.google.protobuf.ByteString accountName = com.google.protobuf.ByteString.copyFrom(randomBytes(16)); + com.google.protobuf.ByteString address = ByteString.copyFrom(randomBytes(32)); + Protocol.AccountType accountType = Protocol.AccountType.forNumber(1); + AccountCapsule accountCapsule = new AccountCapsule(accountName, address, accountType); + accountCapsule.addAssetV2(ByteArray.fromString(String.valueOf(1)), 1000L); + return accountCapsule; + } + + private static AccountCapsule createAccount2() { + AccountAssetStore accountAssetStore = dbManager.getAccountAssetStore(); + com.google.protobuf.ByteString accountName = com.google.protobuf.ByteString.copyFrom(randomBytes(16)); + com.google.protobuf.ByteString address = ByteString.copyFrom(randomBytes(32)); + Protocol.AccountType accountType = Protocol.AccountType.forNumber(1); + AccountCapsule accountCapsule = new AccountCapsule(accountName, address, accountType); + + Protocol.AccountAsset accountAsset = Protocol.AccountAsset.newBuilder() + .setAddress(accountCapsule.getInstance().getAddress()) + .setAssetIssuedID(accountCapsule.getAssetIssuedID()) + .setAssetIssuedName(accountCapsule.getAssetIssuedName()) + .build(); + accountAssetStore.put(accountCapsule.createDbKey(), new AccountAssetCapsule( + accountAsset)); + return accountCapsule; + } + + @Test + public void testGetAsset() { + AccountCapsule account = createAccount(); + Protocol.AccountAsset asset = AssetUtil.getAsset(account.getInstance()); + Assert.assertNotNull(asset); + } + + @Test + public void testImport() { + AccountCapsule account = createAccount2(); + Protocol.Account asset = AssetUtil.importAsset(account.getInstance()); + Assert.assertNotNull(asset); + } + +} From 02dc016f8194fe7a752796f9f4b623d5e3b82228 Mon Sep 17 00:00:00 2001 From: liukai Date: Wed, 11 Aug 2021 19:08:24 +0800 Subject: [PATCH 103/341] add test case of AssetUtilTest --- .../core/capsule/utils/AssetUtilTest.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/framework/src/test/java/org/tron/core/capsule/utils/AssetUtilTest.java b/framework/src/test/java/org/tron/core/capsule/utils/AssetUtilTest.java index bf1a5def893..266446e8b51 100644 --- a/framework/src/test/java/org/tron/core/capsule/utils/AssetUtilTest.java +++ b/framework/src/test/java/org/tron/core/capsule/utils/AssetUtilTest.java @@ -16,6 +16,8 @@ package org.tron.core.capsule.utils; import com.google.protobuf.ByteString; +import java.io.File; +import java.util.Random; import lombok.extern.slf4j.Slf4j; import org.junit.AfterClass; import org.junit.Assert; @@ -32,8 +34,7 @@ import org.tron.core.store.AccountAssetStore; import org.tron.protos.Protocol; -import java.io.File; -import java.util.Random; + @Slf4j public class AssetUtilTest { @@ -62,8 +63,10 @@ public static byte[] randomBytes(int length) { } private static AccountCapsule createAccount() { - com.google.protobuf.ByteString accountName = com.google.protobuf.ByteString.copyFrom(randomBytes(16)); - com.google.protobuf.ByteString address = ByteString.copyFrom(randomBytes(32)); + com.google.protobuf.ByteString accountName = + com.google.protobuf.ByteString.copyFrom(randomBytes(16)); + com.google.protobuf.ByteString address = + ByteString.copyFrom(randomBytes(32)); Protocol.AccountType accountType = Protocol.AccountType.forNumber(1); AccountCapsule accountCapsule = new AccountCapsule(accountName, address, accountType); accountCapsule.addAssetV2(ByteArray.fromString(String.valueOf(1)), 1000L); @@ -72,17 +75,20 @@ private static AccountCapsule createAccount() { private static AccountCapsule createAccount2() { AccountAssetStore accountAssetStore = dbManager.getAccountAssetStore(); - com.google.protobuf.ByteString accountName = com.google.protobuf.ByteString.copyFrom(randomBytes(16)); + com.google.protobuf.ByteString accountName = + com.google.protobuf.ByteString.copyFrom(randomBytes(16)); com.google.protobuf.ByteString address = ByteString.copyFrom(randomBytes(32)); Protocol.AccountType accountType = Protocol.AccountType.forNumber(1); AccountCapsule accountCapsule = new AccountCapsule(accountName, address, accountType); - Protocol.AccountAsset accountAsset = Protocol.AccountAsset.newBuilder() + Protocol.AccountAsset accountAsset = + Protocol.AccountAsset.newBuilder() .setAddress(accountCapsule.getInstance().getAddress()) .setAssetIssuedID(accountCapsule.getAssetIssuedID()) .setAssetIssuedName(accountCapsule.getAssetIssuedName()) .build(); - accountAssetStore.put(accountCapsule.createDbKey(), new AccountAssetCapsule( + accountAssetStore.put(accountCapsule.createDbKey(), + new AccountAssetCapsule( accountAsset)); return accountCapsule; } From 28a98a5a34159434664d54767b85b91b48870c0d Mon Sep 17 00:00:00 2001 From: liukai Date: Thu, 12 Aug 2021 12:39:20 +0800 Subject: [PATCH 104/341] add test case of AssetUtilTest --- .../core/capsule/utils/AssetUtilTest.java | 37 ++++++++++++++++++- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/framework/src/test/java/org/tron/core/capsule/utils/AssetUtilTest.java b/framework/src/test/java/org/tron/core/capsule/utils/AssetUtilTest.java index 266446e8b51..10b40d0945c 100644 --- a/framework/src/test/java/org/tron/core/capsule/utils/AssetUtilTest.java +++ b/framework/src/test/java/org/tron/core/capsule/utils/AssetUtilTest.java @@ -15,9 +15,8 @@ package org.tron.core.capsule.utils; +import com.google.common.collect.Lists; import com.google.protobuf.ByteString; -import java.io.File; -import java.util.Random; import lombok.extern.slf4j.Slf4j; import org.junit.AfterClass; import org.junit.Assert; @@ -34,6 +33,9 @@ import org.tron.core.store.AccountAssetStore; import org.tron.protos.Protocol; +import java.io.File; +import java.util.List; +import java.util.Random; @Slf4j @@ -70,6 +72,11 @@ private static AccountCapsule createAccount() { Protocol.AccountType accountType = Protocol.AccountType.forNumber(1); AccountCapsule accountCapsule = new AccountCapsule(accountName, address, accountType); accountCapsule.addAssetV2(ByteArray.fromString(String.valueOf(1)), 1000L); + Protocol.Account build = accountCapsule.getInstance().toBuilder() + .addAllFrozenSupply(getFrozenList()) + .build(); + accountCapsule.setInstance(build); + return accountCapsule; } @@ -80,6 +87,10 @@ private static AccountCapsule createAccount2() { com.google.protobuf.ByteString address = ByteString.copyFrom(randomBytes(32)); Protocol.AccountType accountType = Protocol.AccountType.forNumber(1); AccountCapsule accountCapsule = new AccountCapsule(accountName, address, accountType); + Protocol.Account build = accountCapsule.getInstance().toBuilder() + .addAllFrozenSupply(getFrozenList()) + .build(); + accountCapsule.setInstance(build); Protocol.AccountAsset accountAsset = Protocol.AccountAsset.newBuilder() @@ -107,4 +118,26 @@ public void testImport() { Assert.assertNotNull(asset); } + @Test + public void tetGetFrozen() { + AccountCapsule account = createAccount2(); + Protocol.Account build = account.getInstance().toBuilder() + .addAllFrozenSupply(getFrozenList()) + .build(); + account.setInstance(build); + Assert.assertNotNull(account.getFrozenSupplyList()); + } + + private static List getFrozenList() { + List frozenList = Lists.newArrayList(); + for (int i = 0; i < 3; i++) { + Protocol.Account.Frozen newFrozen = Protocol.Account.Frozen.newBuilder() + .setFrozenBalance(i * 1000 + 1) + .setExpireTime(1000) + .build(); + frozenList.add(newFrozen); + } + return frozenList; + } + } From b83d13a3144ab65c86ac3c862ddd09af8dadc308 Mon Sep 17 00:00:00 2001 From: liukai Date: Thu, 12 Aug 2021 14:31:12 +0800 Subject: [PATCH 105/341] add test case of AssetUtilTest --- .../tron/core/capsule/utils/AssetUtilTest.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/framework/src/test/java/org/tron/core/capsule/utils/AssetUtilTest.java b/framework/src/test/java/org/tron/core/capsule/utils/AssetUtilTest.java index 10b40d0945c..839e7494c24 100644 --- a/framework/src/test/java/org/tron/core/capsule/utils/AssetUtilTest.java +++ b/framework/src/test/java/org/tron/core/capsule/utils/AssetUtilTest.java @@ -17,6 +17,9 @@ import com.google.common.collect.Lists; import com.google.protobuf.ByteString; +import java.io.File; +import java.util.List; +import java.util.Random; import lombok.extern.slf4j.Slf4j; import org.junit.AfterClass; import org.junit.Assert; @@ -33,9 +36,7 @@ import org.tron.core.store.AccountAssetStore; import org.tron.protos.Protocol; -import java.io.File; -import java.util.List; -import java.util.Random; + @Slf4j @@ -87,10 +88,10 @@ private static AccountCapsule createAccount2() { com.google.protobuf.ByteString address = ByteString.copyFrom(randomBytes(32)); Protocol.AccountType accountType = Protocol.AccountType.forNumber(1); AccountCapsule accountCapsule = new AccountCapsule(accountName, address, accountType); - Protocol.Account build = accountCapsule.getInstance().toBuilder() - .addAllFrozenSupply(getFrozenList()) - .build(); - accountCapsule.setInstance(build); +// Protocol.Account build = accountCapsule.getInstance().toBuilder() +// .addAllFrozenSupply(getFrozenList()) +// .build(); +// accountCapsule.setInstance(build); Protocol.AccountAsset accountAsset = Protocol.AccountAsset.newBuilder() From 470b1a7461a2659c02af8a249fc3ebdd87fc7ec4 Mon Sep 17 00:00:00 2001 From: liukai Date: Thu, 12 Aug 2021 14:40:04 +0800 Subject: [PATCH 106/341] add test case of AssetUtilTest --- .../test/java/org/tron/core/capsule/utils/AssetUtilTest.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/framework/src/test/java/org/tron/core/capsule/utils/AssetUtilTest.java b/framework/src/test/java/org/tron/core/capsule/utils/AssetUtilTest.java index 839e7494c24..11e77097baa 100644 --- a/framework/src/test/java/org/tron/core/capsule/utils/AssetUtilTest.java +++ b/framework/src/test/java/org/tron/core/capsule/utils/AssetUtilTest.java @@ -88,11 +88,6 @@ private static AccountCapsule createAccount2() { com.google.protobuf.ByteString address = ByteString.copyFrom(randomBytes(32)); Protocol.AccountType accountType = Protocol.AccountType.forNumber(1); AccountCapsule accountCapsule = new AccountCapsule(accountName, address, accountType); -// Protocol.Account build = accountCapsule.getInstance().toBuilder() -// .addAllFrozenSupply(getFrozenList()) -// .build(); -// accountCapsule.setInstance(build); - Protocol.AccountAsset accountAsset = Protocol.AccountAsset.newBuilder() .setAddress(accountCapsule.getInstance().getAddress()) From 062fdfba3faeff507414c7dee3e2cc882ff44063 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 12 Aug 2021 15:17:54 +0800 Subject: [PATCH 107/341] feat: use bouncycastle --- .../java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java | 3 +-- framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index 89a2c521640..89a965ffaf8 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -10,10 +10,9 @@ import java.util.List; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.spongycastle.util.encoders.Hex; +import org.bouncycastle.util.encoders.Hex; import org.tron.api.GrpcAPI.AssetIssueList; import org.tron.common.crypto.Hash; -import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.ByteArray; import org.tron.common.utils.ByteUtil; import org.tron.common.utils.Commons; diff --git a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java index dd64c2845c3..c11f442b738 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java @@ -2,8 +2,8 @@ import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getMethodSign; +import org.bouncycastle.util.encoders.Hex; import org.junit.Test; -import org.spongycastle.util.encoders.Hex; import org.tron.common.crypto.Hash; import org.tron.common.runtime.vm.DataWord; import org.tron.common.utils.ByteArray; From 56c04f176396e1df0a9fedd90bac0d05520a6111 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Thu, 12 Aug 2021 15:22:17 +0800 Subject: [PATCH 108/341] opt block process logic --- .../java/org/tron/core/net/TronNetDelegate.java | 17 +++++++++++++++-- .../net/messagehandler/BlockMsgHandler.java | 10 +++++----- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java index 891fde9dad5..f19b9df9ebf 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java +++ b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java @@ -85,6 +85,8 @@ public class TronNetDelegate { private int blockIdCacheSize = 100; + private long timeout = 1000; + private Queue freshBlockId = new ConcurrentLinkedQueue() { @Override public boolean offer(BlockId blockId) { @@ -272,9 +274,20 @@ public void validSignature(BlockCapsule block) throws P2pException { } } - public boolean preValid(BlockCapsule block) throws P2pException { + public boolean validBlock(BlockCapsule block) throws P2pException { + long time = System.currentTimeMillis(); + if (block.getTimeStamp() - time > timeout) { + throw new P2pException(TypeEnum.BAD_BLOCK, + "time:" + time + ",block time:" + block.getTimeStamp()); + } validSignature(block); - return dbManager.validWitness(block); + long headNum = getHeadBlockId().getNum(); + boolean flag = dbManager.validWitness(block); + if (!flag && block.getNum() - headNum <= 1) { + throw new P2pException(TypeEnum.BAD_BLOCK, + "block num:" + block.getNum() + ",head num:" + headNum); + } + return flag; } public PbftSignCapsule getBlockPbftCommitData(long blockNum) { diff --git a/framework/src/main/java/org/tron/core/net/messagehandler/BlockMsgHandler.java b/framework/src/main/java/org/tron/core/net/messagehandler/BlockMsgHandler.java index 06efc81d728..f6e4063efd9 100644 --- a/framework/src/main/java/org/tron/core/net/messagehandler/BlockMsgHandler.java +++ b/framework/src/main/java/org/tron/core/net/messagehandler/BlockMsgHandler.java @@ -106,13 +106,13 @@ private void processBlock(PeerConnection peer, BlockCapsule block) throws P2pExc advService.addInvToCache(item); } - if (block.getNum() < tronNetDelegate.getHeadBlockId().getNum()) { - logger.warn("Receive a low block {}, head {}", - blockId.getString(), tronNetDelegate.getHeadBlockId().getString()); + long headNum = tronNetDelegate.getHeadBlockId().getNum(); + if (block.getNum() < headNum) { + logger.warn("Receive a low block {}, head {}", blockId.getString(), headNum); return; } - boolean flag = tronNetDelegate.preValid(block); + boolean flag = tronNetDelegate.validBlock(block); if (flag) { if (fastForward) { advService.fastForward(new BlockMessage(block)); @@ -140,7 +140,7 @@ private void processBlock(PeerConnection peer, BlockCapsule block) throws P2pExc } }); } catch (Exception e) { - logger.warn("Process block {} from peer {} failed.", blockId, peer.getInetAddress()); + logger.warn("Process adv block {} from peer {} failed.", blockId, peer.getInetAddress()); } } From b209e99354d6b4940fb3abcb014e48322ca0e8fd Mon Sep 17 00:00:00 2001 From: wubin01 Date: Thu, 12 Aug 2021 15:40:23 +0800 Subject: [PATCH 109/341] improve log information --- .../java/org/tron/core/net/messagehandler/BlockMsgHandler.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/net/messagehandler/BlockMsgHandler.java b/framework/src/main/java/org/tron/core/net/messagehandler/BlockMsgHandler.java index f6e4063efd9..19f30358660 100644 --- a/framework/src/main/java/org/tron/core/net/messagehandler/BlockMsgHandler.java +++ b/framework/src/main/java/org/tron/core/net/messagehandler/BlockMsgHandler.java @@ -140,7 +140,8 @@ private void processBlock(PeerConnection peer, BlockCapsule block) throws P2pExc } }); } catch (Exception e) { - logger.warn("Process adv block {} from peer {} failed.", blockId, peer.getInetAddress()); + logger.warn("Process adv block {} from peer {} failed. reason: {}", + blockId, peer.getInetAddress(), e.getMessage()); } } From 621ac4b9b66dee478edffc7e0c06a937f3f50597 Mon Sep 17 00:00:00 2001 From: Asuka Date: Thu, 12 Aug 2021 22:46:30 +0800 Subject: [PATCH 110/341] test: improve code coverage - Enable BatchValidateSign and ValidateMultiSign precompile contract test - Improve ReceiptCapsule coverage --- .../common/runtime/vm/BatchValidateSignContractTest.java | 6 +++--- .../test/java/org/tron/common/runtime/vm/FreezeTest.java | 2 +- .../common/runtime/vm/ValidateMultiSignContractTest.java | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java index d83d61dc4cb..f36ec74d1cb 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java @@ -6,8 +6,8 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.tuple.Pair; import org.bouncycastle.util.encoders.Hex; +import org.junit.Test; import org.testng.Assert; -import org.testng.annotations.Test; import org.tron.common.crypto.ECKey; import org.tron.common.crypto.Hash; import org.tron.common.utils.StringUtil; @@ -33,7 +33,7 @@ public class BatchValidateSignContractTest { PrecompiledContracts.BatchValidateSign contract = new BatchValidateSign(); @Test - void staticCallTest() { + public void staticCallTest() { contract.setConstantCall(true); List signatures = new ArrayList<>(); List addresses = new ArrayList<>(); @@ -87,7 +87,7 @@ void staticCallTest() { } @Test - void correctionTest() { + public void correctionTest() { contract.setConstantCall(false); List signatures = new ArrayList<>(); List addresses = new ArrayList<>(); diff --git a/framework/src/test/java/org/tron/common/runtime/vm/FreezeTest.java b/framework/src/test/java/org/tron/common/runtime/vm/FreezeTest.java index a2f8790a8ba..8fea80d691a 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/FreezeTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/FreezeTest.java @@ -140,7 +140,7 @@ public void init() throws Exception { rootDeposit.commit(); ConfigLoader.disable = true; - //manager.getDynamicPropertiesStore().saveAllowTvmFreeze(1); + manager.getDynamicPropertiesStore().saveAllowTvmFreeze(1); VMConfig.initVmHardFork(true); VMConfig.initAllowTvmTransferTrc10(1); VMConfig.initAllowTvmConstantinople(1); diff --git a/framework/src/test/java/org/tron/common/runtime/vm/ValidateMultiSignContractTest.java b/framework/src/test/java/org/tron/common/runtime/vm/ValidateMultiSignContractTest.java index 8064e58be22..523a6c41d45 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/ValidateMultiSignContractTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/ValidateMultiSignContractTest.java @@ -7,8 +7,8 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.tuple.Pair; import org.bouncycastle.util.encoders.Hex; +import org.junit.Test; import org.testng.Assert; -import org.testng.annotations.Test; import org.tron.common.application.Application; import org.tron.common.application.ApplicationFactory; import org.tron.common.application.TronApplicationContext; @@ -56,7 +56,7 @@ public class ValidateMultiSignContractTest { ValidateMultiSign contract = new ValidateMultiSign(); @Test - void testAddressNonExist() { + public void testAddressNonExist() { byte[] hash = Hash.sha3(longData); ECKey key = new ECKey(); byte[] sign = key.sign(hash).toByteArray(); @@ -70,7 +70,7 @@ void testAddressNonExist() { } @Test - void testDifferentCase() { + public void testDifferentCase() { //Create an account with permission ECKey key = new ECKey(); From d2cbb7acb989ce148d730802108f710d666350c3 Mon Sep 17 00:00:00 2001 From: Asuka Date: Fri, 13 Aug 2021 00:16:46 +0800 Subject: [PATCH 111/341] test: decrease long data --- .../tron/common/runtime/vm/BatchValidateSignContractTest.java | 2 +- .../tron/common/runtime/vm/ValidateMultiSignContractTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java index f36ec74d1cb..3884a509ffe 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java @@ -25,7 +25,7 @@ public class BatchValidateSignContractTest { static { smellData = new byte[10]; - longData = new byte[100000000]; + longData = new byte[1000000]; Arrays.fill(smellData, (byte) 1); Arrays.fill(longData, (byte) 2); } diff --git a/framework/src/test/java/org/tron/common/runtime/vm/ValidateMultiSignContractTest.java b/framework/src/test/java/org/tron/common/runtime/vm/ValidateMultiSignContractTest.java index 523a6c41d45..a4469790bdd 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/ValidateMultiSignContractTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/ValidateMultiSignContractTest.java @@ -49,7 +49,7 @@ public class ValidateMultiSignContractTest { dbManager.getDynamicPropertiesStore().saveAllowMultiSign(1); dbManager.getDynamicPropertiesStore().saveTotalSignNum(5); - longData = new byte[100000000]; + longData = new byte[1000000]; Arrays.fill(longData, (byte) 2); } From 4b5e64ef65bf3ff498d3fd311827921245328008 Mon Sep 17 00:00:00 2001 From: Asuka Date: Fri, 13 Aug 2021 10:41:05 +0800 Subject: [PATCH 112/341] bugfix: solve test db conflict --- .../tron/common/runtime/vm/ValidateMultiSignContractTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/test/java/org/tron/common/runtime/vm/ValidateMultiSignContractTest.java b/framework/src/test/java/org/tron/common/runtime/vm/ValidateMultiSignContractTest.java index a4469790bdd..883e65a99cc 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/ValidateMultiSignContractTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/ValidateMultiSignContractTest.java @@ -34,7 +34,7 @@ @Slf4j public class ValidateMultiSignContractTest { - private static final String dbPath = "output_PrecompiledContracts_test"; + private static final String dbPath = "output_ValidateMultiSignContract_test"; private static final String METHOD_SIGN = "validatemultisign(address,uint256,bytes32,bytes[])"; private static final byte[] longData; private static TronApplicationContext context; From bee30f1bded3a4c1ffd3fae1424f83f8bb2806c7 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Fri, 13 Aug 2021 16:08:57 +0800 Subject: [PATCH 113/341] remove unuse test --- .../test/java/org/tron/core/db/ManagerTest.java | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/framework/src/test/java/org/tron/core/db/ManagerTest.java b/framework/src/test/java/org/tron/core/db/ManagerTest.java index 1afed82745d..645a1543fb2 100755 --- a/framework/src/test/java/org/tron/core/db/ManagerTest.java +++ b/framework/src/test/java/org/tron/core/db/ManagerTest.java @@ -231,23 +231,6 @@ public void GetterInstanceTest() { } - -// @Test -// public void pushBlockInvalidSignature() { -// // invalid witness address cause invalid signature -// String invalidWitness = "bcab94c3e0c9214fb4ac7ff9d7d5a937d1f40031f"; -// blockCapsule2.setWitness(invalidWitness); -// try { -// dbManager.pushBlock(blockCapsule2); -// Assert.assertTrue(false); -// } catch (BadBlockException e) { -// Assert.assertEquals("The signature is not validated", e.getMessage()); -// } catch (Exception e) { -// Assert.assertFalse(e instanceof Exception); -// } -// } - - @Test public void getHeadTest() { try { From de1f3862c907ac994199748b5d5007a0dd38c46d Mon Sep 17 00:00:00 2001 From: wubin01 Date: Tue, 17 Aug 2021 15:29:19 +0800 Subject: [PATCH 114/341] optimize the handshake logic --- .../tron/common/overlay/server/HandshakeHandler.java | 3 ++- .../java/org/tron/core/net/peer/PeerConnection.java | 11 +++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/framework/src/main/java/org/tron/common/overlay/server/HandshakeHandler.java b/framework/src/main/java/org/tron/common/overlay/server/HandshakeHandler.java index d865014fcd7..0858a383304 100644 --- a/framework/src/main/java/org/tron/common/overlay/server/HandshakeHandler.java +++ b/framework/src/main/java/org/tron/common/overlay/server/HandshakeHandler.java @@ -123,6 +123,7 @@ protected void sendHelloMsg(ChannelHandlerContext ctx, long time) { chainBaseManager.getGenesisBlockId(), chainBaseManager.getSolidBlockId(), chainBaseManager.getHeadBlockId()); fastForward.fillHelloMessage(message, channel); + ((PeerConnection) channel).setHelloMessageSend(message); ctx.writeAndFlush(message.getSendData()); channel.getNodeStatistics().messageStatistics.addTcpOutMessage(message); MetricsUtil.meterMark(MetricsKey.NET_TCP_OUT_TRAFFIC, @@ -174,7 +175,7 @@ private void handleHelloMsg(ChannelHandlerContext ctx, HelloMessage msg) { return; } - ((PeerConnection) channel).setHelloMessage(msg); + ((PeerConnection) channel).setHelloMessageReceive(msg); channel.getNodeStatistics().messageStatistics.addTcpInMessage(msg); diff --git a/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java b/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java index 01f9e0b6f66..2b1e52e5da9 100644 --- a/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java +++ b/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java @@ -43,7 +43,11 @@ public class PeerConnection extends Channel { @Setter @Getter - private HelloMessage helloMessage; + private HelloMessage helloMessageReceive; + + @Setter + @Getter + private HelloMessage helloMessageSend; private int invCacheSize = 100_000; @@ -114,12 +118,11 @@ public void fastSend(Message message) { } public void onConnect() { - long headBlockNum = tronNetDelegate.getHeadBlockId().getNum(); - long peerHeadBlockNum = getHelloMessage().getHeadBlockId().getNum(); + long headBlockNum = helloMessageSend.getHeadBlockId().getNum(); + long peerHeadBlockNum = helloMessageReceive.getHeadBlockId().getNum(); if (peerHeadBlockNum > headBlockNum) { needSyncFromUs = false; - setTronState(TronState.SYNCING); syncService.startSync(this); } else { needSyncFromPeer = false; From 185aa7fdabea95ec8c3556d14331d6c668814166 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Tue, 17 Aug 2021 15:43:30 +0800 Subject: [PATCH 115/341] feat: add api access control, test version --- .../org/tron/core/services/RpcApiService.java | 6 ++ .../services/filter/HttpAccessFilter.java | 57 +++++++++++++++++++ .../services/http/FullNodeHttpApiService.java | 11 +++- .../solidity/SolidityNodeHttpApiService.java | 13 +++++ .../interfaceOnPBFT/RpcApiServiceOnPBFT.java | 7 +++ .../http/PBFT/HttpApiOnPBFTService.java | 9 +++ .../RpcApiServiceOnSolidity.java | 7 +++ .../solidity/HttpApiOnSolidityService.java | 12 ++++ .../ratelimiter/ApiAccessInterceptor.java | 39 +++++++++++++ .../ratelimiter/RateLimiterInterceptor.java | 3 - 10 files changed, 160 insertions(+), 4 deletions(-) create mode 100644 framework/src/main/java/org/tron/core/services/filter/HttpAccessFilter.java create mode 100644 framework/src/main/java/org/tron/core/services/ratelimiter/ApiAccessInterceptor.java diff --git a/framework/src/main/java/org/tron/core/services/RpcApiService.java b/framework/src/main/java/org/tron/core/services/RpcApiService.java index 241539c2e62..597355dd3f9 100755 --- a/framework/src/main/java/org/tron/core/services/RpcApiService.java +++ b/framework/src/main/java/org/tron/core/services/RpcApiService.java @@ -112,6 +112,7 @@ import org.tron.core.exception.ZksnarkException; import org.tron.core.metrics.MetricsApiService; import org.tron.core.services.filter.LiteFnQueryGrpcInterceptor; +import org.tron.core.services.ratelimiter.ApiAccessInterceptor; import org.tron.core.services.ratelimiter.RateLimiterInterceptor; import org.tron.core.utils.TransactionUtil; import org.tron.core.zen.address.DiversifierT; @@ -201,6 +202,8 @@ public class RpcApiService implements Service { private RateLimiterInterceptor rateLimiterInterceptor; @Autowired private LiteFnQueryGrpcInterceptor liteFnQueryGrpcInterceptor; + @Autowired + private ApiAccessInterceptor apiAccessInterceptor; @Autowired private MetricsApiService metricsApiService; @@ -261,6 +264,9 @@ public void start() { // add lite fullnode query interceptor serverBuilder.intercept(liteFnQueryGrpcInterceptor); + // add api access interceptor + serverBuilder.intercept(apiAccessInterceptor); + apiServer = serverBuilder.build(); rateLimiterInterceptor.init(apiServer); diff --git a/framework/src/main/java/org/tron/core/services/filter/HttpAccessFilter.java b/framework/src/main/java/org/tron/core/services/filter/HttpAccessFilter.java new file mode 100644 index 00000000000..23ca62738e0 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/filter/HttpAccessFilter.java @@ -0,0 +1,57 @@ +package org.tron.core.services.filter; + +import com.alibaba.fastjson.JSONObject; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; + +@Slf4j(topic = "httpAccessFilter") +public class HttpAccessFilter implements Filter { + + private String endpoint; + + @Override + public void init(FilterConfig filterConfig) { + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { + try { + if (request instanceof HttpServletRequest) { + endpoint = ((HttpServletRequest) request).getRequestURI(); + HttpServletResponse resp = (HttpServletResponse) response; + + if (endpoint.split("/")[2].equals("getnowblock")) { + resp.setStatus(HttpServletResponse.SC_NOT_FOUND); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("Error", "The requested resource is not available due to config"); + resp.getWriter().println(jsonObject.toJSONString()); + return; + } + + CharResponseWrapper responseWrapper = new CharResponseWrapper(resp); + chain.doFilter(request, responseWrapper); + + } else { + chain.doFilter(request, response); + } + + } catch (Exception e) { + } + + } + + @Override + public void destroy() { + + } + +} + + + diff --git a/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java b/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java index 1c219f35bbf..a243379fb37 100644 --- a/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java +++ b/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java @@ -22,6 +22,7 @@ import org.tron.common.zksnark.LibrustzcashParam.InitZksnarkParams; import org.tron.core.config.args.Args; import org.tron.core.exception.ZksnarkException; +import org.tron.core.services.filter.HttpAccessFilter; import org.tron.core.services.filter.HttpInterceptor; import org.tron.core.services.filter.LiteFnQueryHttpFilter; @@ -542,11 +543,19 @@ public void start() { // filter ServletHandler handler = new ServletHandler(); - FilterHolder fh = handler + FilterHolder fh = handler.addFilterWithMapping((Class) HttpAccessFilter.class, "/*", + EnumSet.of(DispatcherType.REQUEST)); + context.addFilter(fh, "/*", EnumSet.of(DispatcherType.REQUEST)); + + handler = new ServletHandler(); + fh = handler .addFilterWithMapping((Class) HttpInterceptor.class, "/*", EnumSet.of(DispatcherType.REQUEST)); context.addFilter(fh, "/*", EnumSet.of(DispatcherType.REQUEST)); + + + server.start(); } catch (Exception e) { logger.debug("IOException: {}", e.getMessage()); diff --git a/framework/src/main/java/org/tron/core/services/http/solidity/SolidityNodeHttpApiService.java b/framework/src/main/java/org/tron/core/services/http/solidity/SolidityNodeHttpApiService.java index 0a3ff9eef4f..0bd2ff66e7f 100644 --- a/framework/src/main/java/org/tron/core/services/http/solidity/SolidityNodeHttpApiService.java +++ b/framework/src/main/java/org/tron/core/services/http/solidity/SolidityNodeHttpApiService.java @@ -1,15 +1,21 @@ package org.tron.core.services.http.solidity; +import java.util.EnumSet; +import javax.servlet.DispatcherType; +import javax.servlet.Filter; import lombok.extern.slf4j.Slf4j; import org.eclipse.jetty.server.ConnectionLimit; import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.servlet.ServletHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.tron.common.application.Service; import org.tron.common.parameter.CommonParameter; import org.tron.core.config.args.Args; +import org.tron.core.services.filter.HttpAccessFilter; import org.tron.core.services.http.FullNodeHttpApiService; import org.tron.core.services.http.GetAccountByIdServlet; import org.tron.core.services.http.GetAccountServlet; @@ -241,6 +247,13 @@ public void start() { context.addServlet(new ServletHolder(getRewardServlet), "/walletsolidity/getReward"); context.addServlet(new ServletHolder(getBurnTrxServlet), "/walletsolidity/getburntrx"); + // filter + ServletHandler handler = new ServletHandler(); + FilterHolder + fh = handler.addFilterWithMapping((Class) HttpAccessFilter.class, "/*", + EnumSet.of(DispatcherType.REQUEST)); + context.addFilter(fh, "/*", EnumSet.of(DispatcherType.REQUEST)); + int maxHttpConnectNumber = Args.getInstance().getMaxHttpConnectNumber(); if (maxHttpConnectNumber > 0) { server.addBean(new ConnectionLimit(maxHttpConnectNumber, server)); diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java index 669414fca35..9c966ffa037 100755 --- a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java @@ -40,6 +40,7 @@ import org.tron.core.config.args.Args; import org.tron.core.services.RpcApiService; import org.tron.core.services.filter.LiteFnQueryGrpcInterceptor; +import org.tron.core.services.ratelimiter.ApiAccessInterceptor; import org.tron.core.services.ratelimiter.RateLimiterInterceptor; import org.tron.protos.Protocol.Account; import org.tron.protos.Protocol.Block; @@ -75,6 +76,9 @@ public class RpcApiServiceOnPBFT implements Service { @Autowired private LiteFnQueryGrpcInterceptor liteFnQueryGrpcInterceptor; + @Autowired + private ApiAccessInterceptor apiAccessInterceptor; + @Override public void init() { } @@ -114,6 +118,9 @@ public void start() { // add lite fullnode query interceptor serverBuilder.intercept(liteFnQueryGrpcInterceptor); + // add api access interceptor + serverBuilder.intercept(apiAccessInterceptor); + apiServer = serverBuilder.build(); rateLimiterInterceptor.init(apiServer); diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/PBFT/HttpApiOnPBFTService.java b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/PBFT/HttpApiOnPBFTService.java index ad6d498e38e..52de7aebe1e 100644 --- a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/PBFT/HttpApiOnPBFTService.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/PBFT/HttpApiOnPBFTService.java @@ -2,16 +2,19 @@ import java.util.EnumSet; import javax.servlet.DispatcherType; +import javax.servlet.Filter; import lombok.extern.slf4j.Slf4j; import org.eclipse.jetty.server.ConnectionLimit; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.servlet.ServletHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.springframework.beans.factory.annotation.Autowired; import org.tron.common.application.Service; import org.tron.common.parameter.CommonParameter; import org.tron.core.config.args.Args; +import org.tron.core.services.filter.HttpAccessFilter; import org.tron.core.services.filter.LiteFnQueryHttpFilter; import org.tron.core.services.interfaceOnPBFT.http.GetAccountByIdOnPBFTServlet; import org.tron.core.services.interfaceOnPBFT.http.GetAccountOnPBFTServlet; @@ -230,6 +233,12 @@ public void start() { context.addServlet(new ServletHolder(getBurnTrxOnPBFTServlet), "/getburntrx"); + // filter + ServletHandler handler = new ServletHandler(); + FilterHolder fh = handler.addFilterWithMapping((Class) HttpAccessFilter.class, "/*", + EnumSet.of(DispatcherType.REQUEST)); + context.addFilter(fh, "/*", EnumSet.of(DispatcherType.REQUEST)); + int maxHttpConnectNumber = Args.getInstance().getMaxHttpConnectNumber(); if (maxHttpConnectNumber > 0) { server.addBean(new ConnectionLimit(maxHttpConnectNumber, server)); diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java index 05f5bc2bbed..9e62d238d56 100755 --- a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java @@ -42,6 +42,7 @@ import org.tron.core.config.args.Args; import org.tron.core.services.RpcApiService; import org.tron.core.services.filter.LiteFnQueryGrpcInterceptor; +import org.tron.core.services.ratelimiter.ApiAccessInterceptor; import org.tron.core.services.ratelimiter.RateLimiterInterceptor; import org.tron.protos.Protocol.Account; import org.tron.protos.Protocol.Block; @@ -77,6 +78,9 @@ public class RpcApiServiceOnSolidity implements Service { @Autowired private LiteFnQueryGrpcInterceptor liteFnQueryGrpcInterceptor; + @Autowired + private ApiAccessInterceptor apiAccessInterceptor; + @Override public void init() { } @@ -114,6 +118,9 @@ public void start() { // add lite fullnode query interceptor serverBuilder.intercept(liteFnQueryGrpcInterceptor); + // add api access interceptor + serverBuilder.intercept(apiAccessInterceptor); + apiServer = serverBuilder.build(); rateLimiterInterceptor.init(apiServer); diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java index 8165abbb275..3aaf4f4af8d 100644 --- a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java @@ -2,16 +2,19 @@ import java.util.EnumSet; import javax.servlet.DispatcherType; +import javax.servlet.Filter; import lombok.extern.slf4j.Slf4j; import org.eclipse.jetty.server.ConnectionLimit; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.servlet.ServletHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.springframework.beans.factory.annotation.Autowired; import org.tron.common.application.Service; import org.tron.common.parameter.CommonParameter; import org.tron.core.config.args.Args; +import org.tron.core.services.filter.HttpAccessFilter; import org.tron.core.services.filter.LiteFnQueryHttpFilter; import org.tron.core.services.interfaceOnSolidity.http.GetAccountByIdOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.GetAccountOnSolidityServlet; @@ -147,6 +150,9 @@ public class HttpApiOnSolidityService implements Service { @Autowired private LiteFnQueryHttpFilter liteFnQueryHttpFilter; + // @Autowired + // private HttpAccessFilter httpAccessFilter; + @Override public void init() { @@ -250,6 +256,12 @@ public void start() { context.addFilter(new FilterHolder(liteFnQueryHttpFilter), "/*", EnumSet.allOf(DispatcherType.class)); + // filter + ServletHandler handler = new ServletHandler(); + FilterHolder fh = handler.addFilterWithMapping((Class) HttpAccessFilter.class, "/*", + EnumSet.of(DispatcherType.REQUEST)); + context.addFilter(fh, "/*", EnumSet.of(DispatcherType.REQUEST)); + int maxHttpConnectNumber = Args.getInstance().getMaxHttpConnectNumber(); if (maxHttpConnectNumber > 0) { server.addBean(new ConnectionLimit(maxHttpConnectNumber, server)); diff --git a/framework/src/main/java/org/tron/core/services/ratelimiter/ApiAccessInterceptor.java b/framework/src/main/java/org/tron/core/services/ratelimiter/ApiAccessInterceptor.java new file mode 100644 index 00000000000..12622d503fc --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/ratelimiter/ApiAccessInterceptor.java @@ -0,0 +1,39 @@ +package org.tron.core.services.ratelimiter; + +import io.grpc.Metadata; +import io.grpc.ServerCall; +import io.grpc.ServerCall.Listener; +import io.grpc.ServerCallHandler; +import io.grpc.ServerInterceptor; +import io.grpc.Status; +import io.grpc.Status.Code; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +public class ApiAccessInterceptor implements ServerInterceptor { + + @Override + public Listener interceptCall(ServerCall call, Metadata headers, + ServerCallHandler next) { + + String fullMethodName = call.getMethodDescriptor().getFullMethodName(); + + // Listener listener = new ServerCall.Listener() {}; + + try { + if (fullMethodName.split("/")[1].toLowerCase().equals("getnowblock2")) { + call.close(Status.fromCode(Code.NOT_FOUND), new Metadata()); + return new ServerCall.Listener() {}; + } else { + return next.startCall(call, headers); + } + } catch (Exception e) { + logger.error("Rpc Api Error: {}", e.getMessage()); + return next.startCall(call, headers); + } + + // return listener; + } +} \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/services/ratelimiter/RateLimiterInterceptor.java b/framework/src/main/java/org/tron/core/services/ratelimiter/RateLimiterInterceptor.java index f7abc4f10a6..a74f89df517 100644 --- a/framework/src/main/java/org/tron/core/services/ratelimiter/RateLimiterInterceptor.java +++ b/framework/src/main/java/org/tron/core/services/ratelimiter/RateLimiterInterceptor.java @@ -21,11 +21,8 @@ import org.tron.core.metrics.MetricsKey; import org.tron.core.metrics.MetricsUtil; import org.tron.core.services.ratelimiter.adapter.DefaultBaseQqsAdapter; -import org.tron.core.services.ratelimiter.adapter.GlobalPreemptibleAdapter; -import org.tron.core.services.ratelimiter.adapter.IPQPSRateLimiterAdapter; import org.tron.core.services.ratelimiter.adapter.IPreemptibleRateLimiter; import org.tron.core.services.ratelimiter.adapter.IRateLimiter; -import org.tron.core.services.ratelimiter.adapter.QpsRateLimiterAdapter; @Slf4j From e79faaecc7d5ddf7fddc948c50a251d990264344 Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Tue, 17 Aug 2021 16:02:59 +0800 Subject: [PATCH 116/341] add unit test --- .../org/tron/plugins/ArchiveManifest.java | 35 +++++++++++-------- .../org/tron/plugins/ArchiveManifestTest.java | 14 ++++---- 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/plugins/src/main/java/org/tron/plugins/ArchiveManifest.java b/plugins/src/main/java/org/tron/plugins/ArchiveManifest.java index cc4a256ee56..caf2cc0dac6 100644 --- a/plugins/src/main/java/org/tron/plugins/ArchiveManifest.java +++ b/plugins/src/main/java/org/tron/plugins/ArchiveManifest.java @@ -56,15 +56,6 @@ public class ArchiveManifest implements Callable { private static final int CPUS = Runtime.getRuntime().availableProcessors(); - private static final ThreadPoolExecutor EXECUTOR = new ThreadPoolExecutor( - CPUS, 16 * CPUS, 1, TimeUnit.MINUTES, - new ArrayBlockingQueue<>(CPUS, true), Executors.defaultThreadFactory(), - new ThreadPoolExecutor.CallerRunsPolicy()); - - static { - EXECUTOR.allowCoreThreadTimeOut(true); - } - public ArchiveManifest(String src, String name, int maxManifestSize, int maxBatchSize) { this.name = name; this.srcDbPath = Paths.get(src, name); @@ -96,6 +87,13 @@ public static org.iq80.leveldb.Options newDefaultLevelDbOptions() { } public static void main(String[] args) { + int code = run(args); + logger.info("exit code {}.", code); + System.out.printf("exit code %d.\n", code); + System.exit(code); + } + + public static int run(String[] args) { Args parameters = new Args(); JCommander jc = JCommander.newBuilder() .addObject(parameters) @@ -103,13 +101,13 @@ public static void main(String[] args) { jc.parse(args); if (parameters.help) { jc.usage(); - return; + return 0; } File dbDirectory = new File(parameters.databaseDirectory); if (!dbDirectory.exists()) { logger.info("Directory {} does not exist.", parameters.databaseDirectory); - return; + return 404; } List files = Arrays.stream(Objects.requireNonNull(dbDirectory.listFiles())) @@ -118,12 +116,19 @@ public static void main(String[] args) { if (files.isEmpty()) { logger.info("Directory {} does not contain any database.", parameters.databaseDirectory); - return; + return 0; } final long time = System.currentTimeMillis(); final List> res = new ArrayList<>(); + final ThreadPoolExecutor executor = new ThreadPoolExecutor( + CPUS, 16 * CPUS, 1, TimeUnit.MINUTES, + new ArrayBlockingQueue<>(CPUS, true), Executors.defaultThreadFactory(), + new ThreadPoolExecutor.CallerRunsPolicy()); + + executor.allowCoreThreadTimeOut(true); + files.forEach(f -> res.add( - EXECUTOR.submit(new ArchiveManifest(parameters.databaseDirectory, f.getName(), + executor.submit(new ArchiveManifest(parameters.databaseDirectory, f.getName(), parameters.maxManifestSize, parameters.maxBatchSize)))); int fails = res.size(); @@ -140,7 +145,7 @@ public static void main(String[] args) { } } - EXECUTOR.shutdown(); + executor.shutdown(); logger.info("DatabaseDirectory:{}, maxManifestSize:{}, maxBatchSize:{}," + "database reopen use {} seconds total.", parameters.databaseDirectory, parameters.maxManifestSize, parameters.maxBatchSize, @@ -148,7 +153,7 @@ public static void main(String[] args) { if (fails > 0) { logger.error("Failed!!!!!!!!!!!!!!!!!!!!!!!! size:{}", fails); } - System.exit(fails); + return fails; } public void open() throws IOException { diff --git a/plugins/src/test/java/org/tron/plugins/ArchiveManifestTest.java b/plugins/src/test/java/org/tron/plugins/ArchiveManifestTest.java index 53a57524579..4fd9e537d05 100644 --- a/plugins/src/test/java/org/tron/plugins/ArchiveManifestTest.java +++ b/plugins/src/test/java/org/tron/plugins/ArchiveManifestTest.java @@ -16,8 +16,8 @@ import java.util.UUID; import lombok.extern.slf4j.Slf4j; -import org.iq80.leveldb.DB; import org.junit.AfterClass; +import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; @@ -58,27 +58,27 @@ public static void destroy() { } @Test - public void testMain() { + public void testRun() { String[] args = new String[] { "-d", OUTPUT_DIRECTORY }; - ArchiveManifest.main(args); + Assert.assertEquals(0, ArchiveManifest.run(args)); } @Test public void testHelp() { String[] args = new String[] {"-h"}; - ArchiveManifest.main(args); + Assert.assertEquals(0, ArchiveManifest.run(args)); } @Test public void testMaxManifest() { String[] args = new String[] {"-d", OUTPUT_DIRECTORY, "-m", "128"}; - ArchiveManifest.main(args); + Assert.assertEquals(0, ArchiveManifest.run(args)); } @Test public void testNotExist() { String[] args = new String[] {"-d", OUTPUT_DIRECTORY + File.separator + UUID.randomUUID()}; - ArchiveManifest.main(args); + Assert.assertEquals(404, ArchiveManifest.run(args)); } @Test @@ -87,7 +87,7 @@ public void testEmpty() { file.mkdirs(); file.deleteOnExit(); String[] args = new String[] {"-d", file.toString()}; - ArchiveManifest.main(args); + Assert.assertEquals(0, ArchiveManifest.run(args)); } private static void writeProperty(String filename, String key, String value) throws IOException { From 1b04a71ce788cd681e4fdf4099af41d78510105d Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Tue, 17 Aug 2021 16:19:53 +0800 Subject: [PATCH 117/341] add unit test for db-convert --- .../main/java/org/tron/program/DBConvert.java | 29 +++-- .../java/org/tron/program/DBConvertTest.java | 116 ++++++++++++++++++ 2 files changed, 134 insertions(+), 11 deletions(-) create mode 100644 framework/src/test/java/org/tron/program/DBConvertTest.java diff --git a/framework/src/main/java/org/tron/program/DBConvert.java b/framework/src/main/java/org/tron/program/DBConvert.java index b4e312d83dc..26037b1b537 100644 --- a/framework/src/main/java/org/tron/program/DBConvert.java +++ b/framework/src/main/java/org/tron/program/DBConvert.java @@ -57,14 +57,7 @@ public class DBConvert implements Callable { private final long startTime; private static final int CPUS = Runtime.getRuntime().availableProcessors(); private static final int BATCH = 256; - private static final ThreadPoolExecutor esDb = new ThreadPoolExecutor( - CPUS, 16 * CPUS, 1, TimeUnit.MINUTES, - new ArrayBlockingQueue<>(CPUS, true), Executors.defaultThreadFactory(), - new ThreadPoolExecutor.CallerRunsPolicy()); - static { - esDb.allowCoreThreadTimeOut(true); - } @Override public Boolean call() throws Exception { @@ -80,7 +73,7 @@ public DBConvert(String src, String dst, String name) { this.startTime = System.currentTimeMillis(); } - private static org.iq80.leveldb.Options newDefaultLevelDbOptions() { + public static org.iq80.leveldb.Options newDefaultLevelDbOptions() { org.iq80.leveldb.Options dbOptions = new org.iq80.leveldb.Options(); dbOptions.createIfMissing(true); dbOptions.paranoidChecks(true); @@ -94,6 +87,13 @@ private static org.iq80.leveldb.Options newDefaultLevelDbOptions() { } public static void main(String[] args) { + int code = run(args); + logger.info("exit code {}.", code); + System.out.printf("exit code %d.\n", code); + System.exit(code); + } + + public static int run(String[] args) { String dbSrc; String dbDst; if (args.length < 2) { @@ -106,7 +106,7 @@ public static void main(String[] args) { File dbDirectory = new File(dbSrc); if (!dbDirectory.exists()) { logger.info(" {} does not exist.", dbSrc); - return; + return 404; } List files = Arrays.stream(Objects.requireNonNull(dbDirectory.listFiles())) .filter(File::isDirectory).collect( @@ -114,11 +114,18 @@ public static void main(String[] args) { if (files.isEmpty()) { logger.info("{} does not contain any database.", dbSrc); - return; + return 0; } final long time = System.currentTimeMillis(); final List> res = new ArrayList<>(); + final ThreadPoolExecutor esDb = new ThreadPoolExecutor( + CPUS, 16 * CPUS, 1, TimeUnit.MINUTES, + new ArrayBlockingQueue<>(CPUS, true), Executors.defaultThreadFactory(), + new ThreadPoolExecutor.CallerRunsPolicy()); + + esDb.allowCoreThreadTimeOut(true); + files.forEach(f -> res.add(esDb.submit(new DBConvert(dbSrc, dbDst, f.getName())))); int fails = res.size(); @@ -142,7 +149,7 @@ public static void main(String[] args) { if (fails > 0) { logger.error("failed!!!!!!!!!!!!!!!!!!!!!!!! size:{}", fails); } - System.exit(fails); + return fails; } public DB newLevelDb(Path db) throws Exception { diff --git a/framework/src/test/java/org/tron/program/DBConvertTest.java b/framework/src/test/java/org/tron/program/DBConvertTest.java new file mode 100644 index 00000000000..7b3f797d627 --- /dev/null +++ b/framework/src/test/java/org/tron/program/DBConvertTest.java @@ -0,0 +1,116 @@ +package org.tron.program; + +import static org.fusesource.leveldbjni.JniDBFactory.factory; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.UUID; +import org.iq80.leveldb.DB; +import org.iq80.leveldb.Options; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.tron.common.utils.ByteArray; +import org.tron.common.utils.FileUtil; +import org.tron.common.utils.MarketOrderPriceComparatorForLevelDB; +import org.tron.core.capsule.MarketOrderIdListCapsule; +import org.tron.core.capsule.utils.MarketUtils; + +public class DBConvertTest { + + + private static final String INPUT_DIRECTORY = "output-directory/convert-database/"; + private static final String OUTPUT_DIRECTORY = "output-directory/convert-database-dest/"; + private static final String ACCOUNT = "account"; + private static final String MARKET = "market_pair_price_to_order"; + + + @BeforeClass + public static void init() throws IOException { + if (new File(INPUT_DIRECTORY).mkdirs()) { + initDB(new File(INPUT_DIRECTORY,ACCOUNT)); + initDB(new File(INPUT_DIRECTORY,MARKET)); + } + } + + private static void initDB(File file) throws IOException { + Options dbOptions = DBConvert.newDefaultLevelDbOptions(); + if (file.getName().contains("market_pair_price_to_order")) { + dbOptions.comparator(new MarketOrderPriceComparatorForLevelDB()); + try (DB db = factory.open(file,dbOptions)) { + + byte[] sellTokenID1 = ByteArray.fromString("100"); + byte[] buyTokenID1 = ByteArray.fromString("200"); + byte[] pairPriceKey1 = MarketUtils.createPairPriceKey( + sellTokenID1, + buyTokenID1, + 1000L, + 2001L + ); + byte[] pairPriceKey2 = MarketUtils.createPairPriceKey( + sellTokenID1, + buyTokenID1, + 1000L, + 2002L + ); + byte[] pairPriceKey3 = MarketUtils.createPairPriceKey( + sellTokenID1, + buyTokenID1, + 1000L, + 2003L + ); + + MarketOrderIdListCapsule capsule1 = new MarketOrderIdListCapsule(ByteArray.fromLong(1), + ByteArray.fromLong(1)); + MarketOrderIdListCapsule capsule2 = new MarketOrderIdListCapsule(ByteArray.fromLong(2), + ByteArray.fromLong(2)); + MarketOrderIdListCapsule capsule3 = new MarketOrderIdListCapsule(ByteArray.fromLong(3), + ByteArray.fromLong(3)); + + //Use out-of-order insertion,key in store should be 1,2,3 + db.put(pairPriceKey1, capsule1.getData()); + db.put(pairPriceKey2, capsule2.getData()); + db.put(pairPriceKey3, capsule3.getData()); + } + + } else { + try (DB db = factory.open(file,dbOptions)) { + for (int i = 0; i < 100; i++) { + byte[] bytes = UUID.randomUUID().toString().getBytes(StandardCharsets.UTF_8); + db.put(bytes, bytes); + } + } + } + + } + + @AfterClass + public static void destroy() { + FileUtil.deleteDir(new File(INPUT_DIRECTORY)); + FileUtil.deleteDir(new File(OUTPUT_DIRECTORY)); + } + + @Test + public void testRun() { + String[] args = new String[] { INPUT_DIRECTORY, OUTPUT_DIRECTORY }; + Assert.assertEquals(0, DBConvert.run(args)); + } + + @Test + public void testNotExist() { + String[] args = new String[] {OUTPUT_DIRECTORY + File.separator + UUID.randomUUID(), + OUTPUT_DIRECTORY}; + Assert.assertEquals(404, DBConvert.run(args)); + } + + @Test + public void testEmpty() { + File file = new File(OUTPUT_DIRECTORY + File.separator + UUID.randomUUID()); + file.mkdirs(); + file.deleteOnExit(); + String[] args = new String[] {file.toString(), OUTPUT_DIRECTORY}; + Assert.assertEquals(0, DBConvert.run(args)); + } +} From 7b378adc9061ae48ab66f5938d36790c9175f0f1 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Tue, 17 Aug 2021 17:09:09 +0800 Subject: [PATCH 118/341] feat: update jsonrpc config --- .../common/parameter/CommonParameter.java | 12 ++--- .../src/main/java/org/tron/core/Constant.java | 12 ++--- .../java/org/tron/common/crypto/sm2/SM2.java | 2 +- .../java/org/tron/core/config/args/Args.java | 48 +++++++++---------- .../JsonRpcServiceOnPBFT.java | 2 +- .../JsonRpcServiceOnSolidity.java | 2 +- .../jsonrpc/FullNodeJsonRpcHttpService.java | 2 +- .../main/java/org/tron/program/FullNode.java | 8 ++-- .../src/main/resources/config-localtest.conf | 9 ++++ .../src/test/resources/config-localtest.conf | 9 ++++ 10 files changed, 62 insertions(+), 44 deletions(-) diff --git a/common/src/main/java/org/tron/common/parameter/CommonParameter.java b/common/src/main/java/org/tron/common/parameter/CommonParameter.java index f56364c19f7..65a94ef63a5 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -170,13 +170,13 @@ public class CommonParameter { public int solidityHttpPort; @Getter @Setter - public int fullNodeJsonRpcHttpPort; + public int jsonRpcHttpFullNodePort; @Getter @Setter - public int solidityJsonRpcHttpPort; + public int jsonRpcHttpSolidityPort; @Getter @Setter - public int pBFTJsonRpcHttpPort; + public int jsonRpcHttpPBFTPort; @Getter @Setter @Parameter(names = {"--rpc-thread"}, description = "Num of gRPC thread") @@ -400,13 +400,13 @@ public class CommonParameter { public boolean solidityNodeHttpEnable = true; @Getter @Setter - public boolean fullNodeHttpJsonRpcEnable = false; + public boolean jsonRpcHttpFullNodeEnable = false; @Getter @Setter - public boolean solidityNodeHttpJsonRpcEnable = false; + public boolean jsonRpcHttpSolidityNodeEnable = false; @Getter @Setter - public boolean pBFTNodeHttpJsonRpcEnable = false; + public boolean jsonRpcHttpPBFTNodeEnable = false; @Getter @Setter public int maxTransactionPendingSize; diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index 1e495e105bd..5be09124e70 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -95,12 +95,12 @@ public class Constant { public static final String NODE_HTTP_SOLIDITY_ENABLE = "node.http.solidityEnable"; public static final String NODE_HTTP_PBFT_PORT = "node.http.PBFTPort"; - public static final String NODE_HTTP_JSONRPC_FULLNODE_ENABLE = "node.http.jsonRpcFullNodeEnable"; - public static final String NODE_HTTP_JSONRPC_FULLNODE_PORT = "node.http.jsonRpcFullNodePort"; - public static final String NODE_HTTP_JSONRPC_SOLIDITY_ENABLE = "node.http.jsonRpcSolidityEnable"; - public static final String NODE_HTTP_JSONRPC_SOLIDITY_PORT = "node.http.jsonRpcSolidityPort"; - public static final String NODE_HTTP_JSONRPC_PBFT_ENABLE = "node.http.jsonRpcPBFTEnable"; - public static final String NODE_HTTP_JSONRPC_PBFT_PORT = "node.http.jsonRpcPBFTPort"; + public static final String NODE_JSONRPC_HTTP_FULLNODE_ENABLE = "node.jsonrpc.httpFullNodeEnable"; + public static final String NODE_JSONRPC_HTTP_FULLNODE_PORT = "node.jsonrpc.httpFullNodePort"; + public static final String NODE_JSONRPC_HTTP_SOLIDITY_ENABLE = "node.jsonrpc.httpSolidityEnable"; + public static final String NODE_JSONRPC_HTTP_SOLIDITY_PORT = "node.jsonrpc.httpSolidityPort"; + public static final String NODE_JSONRPC_HTTP_PBFT_ENABLE = "node.jsonrpc.httpPBFTEnable"; + public static final String NODE_JSONRPC_HTTP_PBFT_PORT = "node.jsonrpc.httpPBFTPort"; public static final String NODE_RPC_THREAD = "node.rpc.thread"; public static final String NODE_SOLIDITY_THREADS = "node.solidity.threads"; diff --git a/crypto/src/main/java/org/tron/common/crypto/sm2/SM2.java b/crypto/src/main/java/org/tron/common/crypto/sm2/SM2.java index aeffedc2f7f..c6aebba385a 100644 --- a/crypto/src/main/java/org/tron/common/crypto/sm2/SM2.java +++ b/crypto/src/main/java/org/tron/common/crypto/sm2/SM2.java @@ -72,7 +72,7 @@ public class SM2 implements Serializable, SignInterface { static { secureRandom = new SecureRandom(); - curve = new ECCurve.Fp(SM2_P, SM2_A, SM2_B); + curve = new ECCurve.Fp(SM2_P, SM2_A, SM2_B, null, null); ecc_point_g = curve.createPoint(SM2_GX, SM2_GY); ecc_param = new ECDomainParameters(curve, ecc_point_g, SM2_N); ecc_spec = new ECParameterSpec(curve, ecc_point_g, SM2_N); diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index 5863cbca052..ed252eed4ca 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -132,9 +132,9 @@ public static void clearParam() { PARAMETER.fullNodeHttpPort = 0; PARAMETER.solidityHttpPort = 0; PARAMETER.pBFTHttpPort = 0; - PARAMETER.fullNodeJsonRpcHttpPort = 0; - PARAMETER.solidityJsonRpcHttpPort = 0; - PARAMETER.pBFTJsonRpcHttpPort = 0; + PARAMETER.jsonRpcHttpFullNodePort = 0; + PARAMETER.jsonRpcHttpSolidityPort = 0; + PARAMETER.jsonRpcHttpPBFTPort = 0; PARAMETER.maintenanceTimeInterval = 0; PARAMETER.proposalExpireTime = 0; PARAMETER.checkFrozenTime = 1; @@ -176,9 +176,9 @@ public static void clearParam() { PARAMETER.changedDelegation = 0; PARAMETER.fullNodeHttpEnable = true; PARAMETER.solidityNodeHttpEnable = true; - PARAMETER.fullNodeHttpJsonRpcEnable = true; - PARAMETER.solidityNodeHttpJsonRpcEnable = true; - PARAMETER.pBFTNodeHttpJsonRpcEnable = false; + PARAMETER.jsonRpcHttpFullNodeEnable = false; + PARAMETER.jsonRpcHttpSolidityNodeEnable = false; + PARAMETER.jsonRpcHttpPBFTNodeEnable = false; PARAMETER.nodeMetricsEnable = false; PARAMETER.metricsStorageEnable = false; PARAMETER.agreeNodeCount = MAX_ACTIVE_WITNESS_NUM * 2 / 3 + 1; @@ -296,19 +296,19 @@ public static void setParam(final String[] args, final String confFileName) { PARAMETER.solidityNodeHttpEnable = config.getBoolean(Constant.NODE_HTTP_SOLIDITY_ENABLE); } - if (config.hasPath(Constant.NODE_HTTP_JSONRPC_FULLNODE_ENABLE)) { - PARAMETER.fullNodeHttpJsonRpcEnable = - config.getBoolean(Constant.NODE_HTTP_JSONRPC_FULLNODE_ENABLE); + if (config.hasPath(Constant.NODE_JSONRPC_HTTP_FULLNODE_ENABLE)) { + PARAMETER.jsonRpcHttpFullNodeEnable = + config.getBoolean(Constant.NODE_JSONRPC_HTTP_FULLNODE_ENABLE); } - if (config.hasPath(Constant.NODE_HTTP_JSONRPC_SOLIDITY_ENABLE)) { - PARAMETER.solidityNodeHttpJsonRpcEnable = - config.getBoolean(Constant.NODE_HTTP_JSONRPC_SOLIDITY_ENABLE); + if (config.hasPath(Constant.NODE_JSONRPC_HTTP_SOLIDITY_ENABLE)) { + PARAMETER.jsonRpcHttpSolidityNodeEnable = + config.getBoolean(Constant.NODE_JSONRPC_HTTP_SOLIDITY_ENABLE); } - if (config.hasPath(Constant.NODE_HTTP_JSONRPC_PBFT_ENABLE)) { - PARAMETER.pBFTNodeHttpJsonRpcEnable = - config.getBoolean(Constant.NODE_HTTP_JSONRPC_PBFT_ENABLE); + if (config.hasPath(Constant.NODE_JSONRPC_HTTP_PBFT_ENABLE)) { + PARAMETER.jsonRpcHttpPBFTNodeEnable = + config.getBoolean(Constant.NODE_JSONRPC_HTTP_PBFT_ENABLE); } if (config.hasPath(Constant.VM_MIN_TIME_RATIO)) { @@ -472,17 +472,17 @@ public static void setParam(final String[] args, final String confFileName) { config.hasPath(Constant.NODE_HTTP_PBFT_PORT) ? config.getInt(Constant.NODE_HTTP_PBFT_PORT) : 8092; - PARAMETER.fullNodeJsonRpcHttpPort = - config.hasPath(Constant.NODE_HTTP_JSONRPC_FULLNODE_PORT) - ? config.getInt(Constant.NODE_HTTP_JSONRPC_FULLNODE_PORT) : 8093; + PARAMETER.jsonRpcHttpFullNodePort = + config.hasPath(Constant.NODE_JSONRPC_HTTP_FULLNODE_PORT) + ? config.getInt(Constant.NODE_JSONRPC_HTTP_FULLNODE_PORT) : 8545; - PARAMETER.solidityJsonRpcHttpPort = - config.hasPath(Constant.NODE_HTTP_JSONRPC_SOLIDITY_PORT) - ? config.getInt(Constant.NODE_HTTP_JSONRPC_SOLIDITY_PORT) : 8094; + PARAMETER.jsonRpcHttpSolidityPort = + config.hasPath(Constant.NODE_JSONRPC_HTTP_SOLIDITY_PORT) + ? config.getInt(Constant.NODE_JSONRPC_HTTP_SOLIDITY_PORT) : 8555; - PARAMETER.pBFTJsonRpcHttpPort = - config.hasPath(Constant.NODE_HTTP_JSONRPC_PBFT_PORT) - ? config.getInt(Constant.NODE_HTTP_JSONRPC_PBFT_PORT) : 8095; + PARAMETER.jsonRpcHttpPBFTPort = + config.hasPath(Constant.NODE_JSONRPC_HTTP_PBFT_PORT) + ? config.getInt(Constant.NODE_JSONRPC_HTTP_PBFT_PORT) : 8565; PARAMETER.rpcThreadNum = config.hasPath(Constant.NODE_RPC_THREAD) ? config.getInt(Constant.NODE_RPC_THREAD) diff --git a/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnPBFT/JsonRpcServiceOnPBFT.java b/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnPBFT/JsonRpcServiceOnPBFT.java index e258b92518f..96da1515610 100644 --- a/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnPBFT/JsonRpcServiceOnPBFT.java +++ b/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnPBFT/JsonRpcServiceOnPBFT.java @@ -14,7 +14,7 @@ @Slf4j(topic = "API") public class JsonRpcServiceOnPBFT implements Service { - private int port = CommonParameter.getInstance().getPBFTJsonRpcHttpPort(); + private int port = CommonParameter.getInstance().getJsonRpcHttpPBFTPort(); private Server server; diff --git a/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcServiceOnSolidity.java b/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcServiceOnSolidity.java index 60c16b72c3e..41357c13dc2 100644 --- a/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcServiceOnSolidity.java +++ b/framework/src/main/java/org/tron/core/services/interfaceJsonRpcOnSolidity/JsonRpcServiceOnSolidity.java @@ -14,7 +14,7 @@ @Slf4j(topic = "API") public class JsonRpcServiceOnSolidity implements Service { - private int port = CommonParameter.getInstance().getSolidityJsonRpcHttpPort(); + private int port = CommonParameter.getInstance().getJsonRpcHttpSolidityPort(); private Server server; diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java index c50c1e572ab..e5b65cecbf6 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java @@ -20,7 +20,7 @@ @Slf4j(topic = "API") public class FullNodeJsonRpcHttpService implements Service { - private int port = CommonParameter.getInstance().getFullNodeJsonRpcHttpPort(); + private int port = CommonParameter.getInstance().getJsonRpcHttpFullNodePort(); private Server server; diff --git a/framework/src/main/java/org/tron/program/FullNode.java b/framework/src/main/java/org/tron/program/FullNode.java index ef3ba52ce41..d41f32210ab 100644 --- a/framework/src/main/java/org/tron/program/FullNode.java +++ b/framework/src/main/java/org/tron/program/FullNode.java @@ -86,7 +86,7 @@ public static void main(String[] args) { } // JSON-RPC http server - if (CommonParameter.getInstance().fullNodeHttpJsonRpcEnable) { + if (CommonParameter.getInstance().jsonRpcHttpFullNodeEnable) { FullNodeJsonRpcHttpService jsonRpcHttpService = context.getBean(FullNodeJsonRpcHttpService.class); appT.addService(jsonRpcHttpService); @@ -105,7 +105,7 @@ public static void main(String[] args) { } // JSON-RPC on solidity - if (CommonParameter.getInstance().solidityNodeHttpJsonRpcEnable) { + if (CommonParameter.getInstance().jsonRpcHttpSolidityNodeEnable) { JsonRpcServiceOnSolidity jsonRpcServiceOnSolidity = context .getBean(JsonRpcServiceOnSolidity.class); appT.addService(jsonRpcServiceOnSolidity); @@ -113,7 +113,7 @@ public static void main(String[] args) { } // PBFT API (HTTP and GRPC) - if (Args.getInstance().getStorage().getDbVersion() == dbVersion) { + if (CommonParameter.getInstance().getStorage().getDbVersion() == dbVersion) { RpcApiServiceOnPBFT rpcApiServiceOnPBFT = context .getBean(RpcApiServiceOnPBFT.class); appT.addService(rpcApiServiceOnPBFT); @@ -122,7 +122,7 @@ public static void main(String[] args) { appT.addService(httpApiOnPBFTService); // JSON-RPC on PBFT - if (CommonParameter.getInstance().pBFTNodeHttpJsonRpcEnable) { + if (CommonParameter.getInstance().jsonRpcHttpPBFTNodeEnable) { JsonRpcServiceOnPBFT jsonRpcServiceOnPBFT = context.getBean(JsonRpcServiceOnPBFT.class); appT.addService(jsonRpcServiceOnPBFT); } diff --git a/framework/src/main/resources/config-localtest.conf b/framework/src/main/resources/config-localtest.conf index a9a56591800..5c9eb55e402 100644 --- a/framework/src/main/resources/config-localtest.conf +++ b/framework/src/main/resources/config-localtest.conf @@ -152,6 +152,15 @@ node { # maxHeaderListSize = } + jsonrpc { + # httpFullNodeEnable = true + # httpFullNodePort = 8545 + # httpSolidityEnable = true + # httpSolidityPort = 8555 + # httpPBFTEnable = true + # httpPBFTPort = 8565 + } + } diff --git a/framework/src/test/resources/config-localtest.conf b/framework/src/test/resources/config-localtest.conf index 1dbc5d534c2..22a41d22564 100644 --- a/framework/src/test/resources/config-localtest.conf +++ b/framework/src/test/resources/config-localtest.conf @@ -157,6 +157,15 @@ node { # maxHeaderListSize = } + jsonrpc { + # httpFullNodeEnable = true + # httpFullNodePort = 8545 + # httpSolidityEnable = true + # httpSolidityPort = 8555 + # httpPBFTEnable = true + # httpPBFTPort = 8565 + } + } From 5eef6006b597daaab7bb8b820d9c77d4fc75c25c Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Tue, 17 Aug 2021 17:22:54 +0800 Subject: [PATCH 119/341] feat: ECCurve.Fp use constructor taking order/cofactor --- crypto/src/main/java/org/tron/common/crypto/sm2/SM2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto/src/main/java/org/tron/common/crypto/sm2/SM2.java b/crypto/src/main/java/org/tron/common/crypto/sm2/SM2.java index aeffedc2f7f..c6aebba385a 100644 --- a/crypto/src/main/java/org/tron/common/crypto/sm2/SM2.java +++ b/crypto/src/main/java/org/tron/common/crypto/sm2/SM2.java @@ -72,7 +72,7 @@ public class SM2 implements Serializable, SignInterface { static { secureRandom = new SecureRandom(); - curve = new ECCurve.Fp(SM2_P, SM2_A, SM2_B); + curve = new ECCurve.Fp(SM2_P, SM2_A, SM2_B, null, null); ecc_point_g = curve.createPoint(SM2_GX, SM2_GY); ecc_param = new ECDomainParameters(curve, ecc_point_g, SM2_N); ecc_spec = new ECParameterSpec(curve, ecc_point_g, SM2_N); From 43cc2620b6c2b1bca624886a1ffe2f2784b204ee Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Tue, 17 Aug 2021 17:33:44 +0800 Subject: [PATCH 120/341] add retry for rocksdb --- .../main/java/org/tron/program/DBConvert.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/program/DBConvert.java b/framework/src/main/java/org/tron/program/DBConvert.java index 26037b1b537..bda3b0a5b8d 100644 --- a/framework/src/main/java/org/tron/program/DBConvert.java +++ b/framework/src/main/java/org/tron/program/DBConvert.java @@ -30,6 +30,7 @@ import org.rocksdb.RocksDB; import org.rocksdb.RocksDBException; import org.rocksdb.RocksIterator; +import org.rocksdb.Status; import org.tron.common.utils.FileUtil; import org.tron.common.utils.MarketOrderPriceComparatorForLevelDB; import org.tron.common.utils.MarketOrderPriceComparatorForRockDB; @@ -213,12 +214,18 @@ private void batchInsert(RocksDB rocks, List keys, List values) values.clear(); } + /** + * https://github.com/facebook/rocksdb/issues/6625 + * @param rocks db + * @param batch write batch + * @throws Exception + */ private void write(RocksDB rocks, org.rocksdb.WriteBatch batch) throws Exception { try { rocks.write(new org.rocksdb.WriteOptions(), batch); } catch (RocksDBException e) { // retry - if (e.getMessage() != null && "Write stall".equalsIgnoreCase(e.getMessage())) { + if (maybeRetry(e)) { TimeUnit.MILLISECONDS.sleep(1); write(rocks, batch); } else { @@ -227,6 +234,17 @@ private void write(RocksDB rocks, org.rocksdb.WriteBatch batch) throws Exception } } + private boolean maybeRetry(RocksDBException e) { + boolean retry = false; + if (e.getStatus() != null) { + retry = e.getStatus().getCode() == Status.Code.TryAgain + || e.getStatus().getCode() == Status.Code.Busy + || e.getStatus().getCode() == Status.Code.Incomplete; + } + return retry || (e.getMessage() != null && ("Write stall".equalsIgnoreCase(e.getMessage()) + || ("Incomplete").equalsIgnoreCase(e.getMessage()))); + } + /** * https://github.com/facebook/rocksdb/wiki/RocksDB-FAQ . * What's the fastest way to load data into RocksDB? From dd3737ce6bc36d305c6998c8a3dea1afea69974f Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Tue, 17 Aug 2021 18:27:16 +0800 Subject: [PATCH 121/341] optimize leveldb params --- .../main/java/org/tron/common/utils/DbOptionalsUtils.java | 6 +++--- .../test/java/org/tron/core/config/args/StorageTest.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/common/src/main/java/org/tron/common/utils/DbOptionalsUtils.java b/common/src/main/java/org/tron/common/utils/DbOptionalsUtils.java index b400ae6686f..61af37b1060 100644 --- a/common/src/main/java/org/tron/common/utils/DbOptionalsUtils.java +++ b/common/src/main/java/org/tron/common/utils/DbOptionalsUtils.java @@ -8,9 +8,9 @@ public class DbOptionalsUtils { public static final CompressionType DEFAULT_COMPRESSION_TYPE = CompressionType.SNAPPY; public static final int DEFAULT_BLOCK_SIZE = 4 * 1024; - public static final int DEFAULT_WRITE_BUFFER_SIZE = 10 * 1024 * 1024; - public static final long DEFAULT_CACHE_SIZE = 10 * 1024 * 1024L; - public static final int DEFAULT_MAX_OPEN_FILES = 100; + public static final int DEFAULT_WRITE_BUFFER_SIZE = 64 * 1024 * 1024; + public static final long DEFAULT_CACHE_SIZE = 32 * 1024 * 1024L; + public static final int DEFAULT_MAX_OPEN_FILES = 5000; public static Options createDefaultDbOptions() { Options dbOptions = new Options(); diff --git a/framework/src/test/java/org/tron/core/config/args/StorageTest.java b/framework/src/test/java/org/tron/core/config/args/StorageTest.java index f8086cc6f11..c025acc4ea0 100644 --- a/framework/src/test/java/org/tron/core/config/args/StorageTest.java +++ b/framework/src/test/java/org/tron/core/config/args/StorageTest.java @@ -80,9 +80,9 @@ public void getOptions() { Assert.assertTrue(options.verifyChecksums()); Assert.assertEquals(CompressionType.SNAPPY, options.compressionType()); Assert.assertEquals(4 * 1024, options.blockSize()); - Assert.assertEquals(10 * 1024 * 1024, options.writeBufferSize()); - Assert.assertEquals(10 * 1024 * 1024L, options.cacheSize()); - Assert.assertEquals(100, options.maxOpenFiles()); + Assert.assertEquals(64 * 1024 * 1024, options.writeBufferSize()); + Assert.assertEquals(32 * 1024 * 1024L, options.cacheSize()); + Assert.assertEquals(5000, options.maxOpenFiles()); } } From 04c37a1409c74fb07bf062ba5d1d58ca524fa0a7 Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Tue, 17 Aug 2021 18:31:28 +0800 Subject: [PATCH 122/341] optimize properties db reduce get count from snapshot --- .../org/tron/core/db2/core/SnapshotImpl.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotImpl.java b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotImpl.java index fb3d028a6be..dbb78251a57 100644 --- a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotImpl.java +++ b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotImpl.java @@ -7,7 +7,6 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; -import java.util.List; import java.util.Map; import java.util.Set; import lombok.Getter; @@ -23,13 +22,21 @@ public class SnapshotImpl extends AbstractSnapshot { protected Snapshot root; SnapshotImpl(Snapshot snapshot) { + root = snapshot.getRoot(); synchronized (this) { - db = new HashDB(SnapshotImpl.class.getSimpleName()); + db = new HashDB(SnapshotImpl.class.getSimpleName() + ":" + root.getDbName()); } - - root = snapshot.getRoot(); previous = snapshot; snapshot.setNext(this); + + // merge for DynamicPropertiesStore,100 keys + if ("properties".equalsIgnoreCase(root.getDbName())) { + if (root == previous ){ + Streams.stream(root.iterator()).forEach( e -> put(e.getKey(),e.getValue())); + }else { + merge(previous); + } + } } @Override @@ -40,6 +47,10 @@ public byte[] get(byte[] key) { private byte[] get(Snapshot head, byte[] key) { Snapshot snapshot = head; Value value; + if ("properties".equalsIgnoreCase(root.getDbName())) { + value = db.get(Key.of(key)); + return value == null ? null: value.getBytes(); + } while (Snapshot.isImpl(snapshot)) { if ((value = ((SnapshotImpl) snapshot).db.get(Key.of(key))) != null) { return value.getBytes(); From 0d8a09487b7aefe18de02ba482d97fb1b4240037 Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Tue, 17 Aug 2021 18:38:28 +0800 Subject: [PATCH 123/341] fix may be dead loop for proposal --- .../main/java/org/tron/core/consensus/ProposalController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/src/main/java/org/tron/core/consensus/ProposalController.java b/framework/src/main/java/org/tron/core/consensus/ProposalController.java index 88a1b3d3187..9370291da7f 100644 --- a/framework/src/main/java/org/tron/core/consensus/ProposalController.java +++ b/framework/src/main/java/org/tron/core/consensus/ProposalController.java @@ -40,6 +40,7 @@ public void processProposals() { .get(ProposalCapsule.calculateDbKey(proposalNum)); } catch (Exception ex) { logger.error("", ex); + proposalNum--; continue; } From 82a4a3033917d787294c7d823577edbcfe71fb09 Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Tue, 17 Aug 2021 18:43:26 +0800 Subject: [PATCH 124/341] fix codestyle --- framework/src/main/java/org/tron/program/DBConvert.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/program/DBConvert.java b/framework/src/main/java/org/tron/program/DBConvert.java index bda3b0a5b8d..8dd2ad04793 100644 --- a/framework/src/main/java/org/tron/program/DBConvert.java +++ b/framework/src/main/java/org/tron/program/DBConvert.java @@ -218,7 +218,7 @@ private void batchInsert(RocksDB rocks, List keys, List values) * https://github.com/facebook/rocksdb/issues/6625 * @param rocks db * @param batch write batch - * @throws Exception + * @throws Exception RocksDBException */ private void write(RocksDB rocks, org.rocksdb.WriteBatch batch) throws Exception { try { From 7727fecf6e47a40c9602698e1d9ee45b514f82b3 Mon Sep 17 00:00:00 2001 From: Asuka Date: Wed, 18 Aug 2021 15:36:12 +0800 Subject: [PATCH 125/341] test: solve Create2Test failure --- .../common/runtime/vm/BatchValidateSignContractTest.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java index 3884a509ffe..f2b856afc85 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java @@ -57,9 +57,7 @@ public void staticCallTest() { Pair ret; ret = validateMultiSign(hash, signatures, addresses); for (int i = 0; i < 16; i++) { - if (i >= 27) { - Assert.assertEquals(ret.getValue()[i], 0); - } else if (i % 5 == 0) { + if (i % 5 == 0) { Assert.assertEquals(ret.getValue()[i], 0); } else if (i == 13) { Assert.assertEquals(ret.getValue()[i], 0); @@ -71,7 +69,7 @@ public void staticCallTest() { addresses = new ArrayList<>(); //test when length >= 16 - for (int i = 0; i < 100; i++) { + for (int i = 0; i < 17; i++) { ECKey key = new ECKey(); byte[] sign = key.sign(hash).toByteArray(); if (i == 11) { @@ -133,7 +131,7 @@ public void correctionTest() { //test when length >= 32 signatures = new ArrayList<>(); addresses = new ArrayList<>(); - for (int i = 0; i < 80; i++) { + for (int i = 0; i < 33; i++) { ECKey key = new ECKey(); byte[] sign = key.sign(hash).toByteArray(); if (i == 13) { From 4db66284633984e1fcbbc988c46111af218dc626 Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Wed, 18 Aug 2021 16:07:52 +0800 Subject: [PATCH 126/341] Optimize equal --- .../java/org/tron/core/db2/core/AbstractSnapshot.java | 7 +++++++ .../src/main/java/org/tron/core/db2/core/Snapshot.java | 2 ++ .../main/java/org/tron/core/db2/core/SnapshotImpl.java | 9 +++++---- .../main/java/org/tron/core/db2/core/SnapshotRoot.java | 1 + 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/chainbase/src/main/java/org/tron/core/db2/core/AbstractSnapshot.java b/chainbase/src/main/java/org/tron/core/db2/core/AbstractSnapshot.java index 496a0fd09ac..ba6c77d43a2 100644 --- a/chainbase/src/main/java/org/tron/core/db2/core/AbstractSnapshot.java +++ b/chainbase/src/main/java/org/tron/core/db2/core/AbstractSnapshot.java @@ -15,6 +15,8 @@ public abstract class AbstractSnapshot implements Snapshot { protected WeakReference next; + protected boolean isOptimized; + @Override public Snapshot advance() { return new SnapshotImpl(this); @@ -34,4 +36,9 @@ public void setNext(Snapshot next) { public String getDbName() { return db.getDbName(); } + + @Override + public boolean isOptimized(){ + return isOptimized; + } } diff --git a/chainbase/src/main/java/org/tron/core/db2/core/Snapshot.java b/chainbase/src/main/java/org/tron/core/db2/core/Snapshot.java index e1ca149b207..db59713f34d 100644 --- a/chainbase/src/main/java/org/tron/core/db2/core/Snapshot.java +++ b/chainbase/src/main/java/org/tron/core/db2/core/Snapshot.java @@ -46,4 +46,6 @@ static boolean isImpl(Snapshot snapshot) { void updateSolidity(); String getDbName(); + + boolean isOptimized(); } diff --git a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotImpl.java b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotImpl.java index dbb78251a57..d71c97ccf73 100644 --- a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotImpl.java +++ b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotImpl.java @@ -28,9 +28,10 @@ public class SnapshotImpl extends AbstractSnapshot { } previous = snapshot; snapshot.setNext(this); - - // merge for DynamicPropertiesStore,100 keys - if ("properties".equalsIgnoreCase(root.getDbName())) { + // inherit + isOptimized = snapshot.isOptimized(); + // merge for DynamicPropertiesStore,about 100 keys + if (isOptimized) { if (root == previous ){ Streams.stream(root.iterator()).forEach( e -> put(e.getKey(),e.getValue())); }else { @@ -47,7 +48,7 @@ public byte[] get(byte[] key) { private byte[] get(Snapshot head, byte[] key) { Snapshot snapshot = head; Value value; - if ("properties".equalsIgnoreCase(root.getDbName())) { + if (isOptimized) { value = db.get(Key.of(key)); return value == null ? null: value.getBytes(); } diff --git a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotRoot.java b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotRoot.java index 0be14f0a482..b69d55098c8 100644 --- a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotRoot.java +++ b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotRoot.java @@ -20,6 +20,7 @@ public class SnapshotRoot extends AbstractSnapshot { public SnapshotRoot(DB db) { this.db = db; solidity = this; + isOptimized = "properties".equalsIgnoreCase(db.getDbName()); } @Override From 8ea46a0610b5e107de46d4acf8c7da55d697c81a Mon Sep 17 00:00:00 2001 From: Asuka Date: Wed, 18 Aug 2021 16:14:25 +0800 Subject: [PATCH 127/341] bugfix: try to solve through triggering full gc --- .../tron/common/runtime/vm/BatchValidateSignContractTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java index f2b856afc85..553eaf2908b 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java @@ -82,6 +82,7 @@ public void staticCallTest() { ret = validateMultiSign(hash, signatures, addresses); Assert.assertEquals(ret.getValue().length, 32); Assert.assertEquals(ret.getValue(), new byte[32]); + System.gc(); // force triggering full gc to avoid timeout for next test } @Test @@ -144,8 +145,7 @@ public void correctionTest() { ret = validateMultiSign(hash, signatures, addresses); Assert.assertEquals(ret.getValue().length, 32); Assert.assertEquals(ret.getValue(), new byte[32]); - - + System.gc(); // force triggering full gc to avoid timeout for next test } Pair validateMultiSign(byte[] hash, List signatures, From 78a5cb8b662507f5809404642eb9fd19109cf14b Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 18 Aug 2021 22:07:55 +0800 Subject: [PATCH 128/341] feat: modify estimateGas, gasPrice and getChainId --- .../src/main/java/org/tron/core/Wallet.java | 9 ++ .../core/services/jsonrpc/BuildArguments.java | 16 +++- .../core/services/jsonrpc/TronJsonRpc.java | 65 ++++++++++++-- .../services/jsonrpc/TronJsonRpcImpl.java | 88 ++++++++++++------- 4 files changed, 134 insertions(+), 44 deletions(-) diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index f8ba69b8840..c735d90be47 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -653,6 +653,15 @@ public Block getBlockByNum(long blockNum) { } } + public BlockCapsule getBlockCapsuleByNum(long blockNum) { + try { + return chainBaseManager.getBlockByNum(blockNum); + } catch (StoreException e) { + logger.info(e.getMessage()); + return null; + } + } + public long getTransactionCountByBlockNum(long blockNum) { long count = 0; diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java b/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java index 18cc911fd7a..61550be5fe3 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java @@ -12,6 +12,7 @@ import org.tron.core.Wallet; import org.tron.core.exception.JsonRpcInvalidParamsException; import org.tron.core.exception.JsonRpcInvalidRequestException; +import org.tron.core.services.jsonrpc.TronJsonRpc.CallArguments; import org.tron.protos.Protocol.Transaction.Contract.ContractType; import org.tron.protos.contract.SmartContractOuterClass.SmartContract; @@ -22,11 +23,11 @@ public class BuildArguments { public String from; public String to; - public String gas; //not used - public String gasPrice; //not used + public String gas = ""; //not used + public String gasPrice = ""; //not used public String value; public String data; - public String nonce; //not used + public String nonce = ""; //not used public Long tokenId = 0L; public Long tokenValue = 0L; @@ -41,6 +42,15 @@ public class BuildArguments { public boolean visible = false; + public BuildArguments(CallArguments args) { + from = args.from; + to = args.to; + gas = args.gas; + gasPrice = args.gasPrice; + value = args.value; + data = args.data; + } + public ContractType getContractType(Wallet wallet) throws JsonRpcInvalidRequestException, JsonRpcInvalidParamsException { ContractType contractType; diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 12b3ed3c4b8..fae2c3cca04 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -1,6 +1,9 @@ package org.tron.core.services.jsonrpc; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.addressHashToByteArray; + import com.alibaba.fastjson.JSONObject; +import com.google.protobuf.ByteString; import com.googlecode.jsonrpc4j.JsonRpcError; import com.googlecode.jsonrpc4j.JsonRpcErrors; import com.googlecode.jsonrpc4j.JsonRpcMethod; @@ -10,11 +13,15 @@ import lombok.NoArgsConstructor; import lombok.ToString; import lombok.Value; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; -import org.tron.core.exception.ItemNotFoundException; +import org.tron.api.GrpcAPI.BytesMessage; +import org.tron.core.Wallet; import org.tron.core.exception.JsonRpcInternalException; import org.tron.core.exception.JsonRpcInvalidParamsException; import org.tron.core.exception.JsonRpcInvalidRequestException; +import org.tron.protos.Protocol.Transaction.Contract.ContractType; +import org.tron.protos.contract.SmartContractOuterClass.SmartContract; @Component public interface TronJsonRpc { @@ -83,9 +90,9 @@ class CallArguments { public String from; public String to; - public String gas; //not used - public String gasPrice; //not used - public String value; //not used + public String gas = ""; //not used + public String gasPrice = ""; //not used + public String value = ""; //not used public String data; public String nonce; @@ -101,6 +108,38 @@ public String toString() { + ", nonce='" + nonce + '\'' + '}'; } + + /** + * just support TransferContract and TriggerSmartContract + * */ + public ContractType getContractType(Wallet wallet) throws JsonRpcInvalidRequestException, + JsonRpcInvalidParamsException { + ContractType contractType; + + // from or to is null + if (StringUtils.isEmpty(from) || from.equals("0x") + || StringUtils.isEmpty(to) || to.equals("0x")) { + throw new JsonRpcInvalidRequestException("invalid json request"); + } else { + byte[] contractAddressData = addressHashToByteArray(to); + BytesMessage.Builder build = BytesMessage.newBuilder(); + BytesMessage bytesMessage = + build.setValue(ByteString.copyFrom(contractAddressData)).build(); + SmartContract smartContract = wallet.getContract(bytesMessage); + + // check if to is smart contract + if (smartContract != null) { + contractType = ContractType.TriggerSmartContract; + } else { + if (StringUtils.isNotEmpty(value)) { + contractType = ContractType.TransferContract; + } else { + throw new JsonRpcInvalidRequestException("invalid json request"); + } + } + } + return contractType; + } } class CompilationResult { @@ -185,7 +224,10 @@ BlockResult ethGetBlockByNumber(String bnOrId, Boolean fullTransactionObjects) String getNetVersion(); @JsonRpcMethod("eth_chainId") - String ethChainId(); + @JsonRpcErrors({ + @JsonRpcError(exception = JsonRpcInternalException.class, code = -32603, data = "{}"), + }) + String ethChainId() throws JsonRpcInternalException; @JsonRpcMethod("net_listening") boolean isListening(); @@ -200,8 +242,7 @@ BlockResult ethGetBlockByNumber(String bnOrId, Boolean fullTransactionObjects) @JsonRpcErrors({ @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), }) - String getTrxBalance(String address, String blockNumOrTag) throws ItemNotFoundException, - JsonRpcInvalidParamsException; + String getTrxBalance(String address, String blockNumOrTag) throws JsonRpcInvalidParamsException; @JsonRpcMethod("eth_getStorageAt") @JsonRpcErrors({ @@ -214,7 +255,7 @@ String getStorageAt(String address, String storageIdx, String blockNumOrTag) @JsonRpcErrors({ @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), }) - String getABIofSmartContract(String contractAddress, String bnOrId) + String getABIOfSmartContract(String contractAddress, String bnOrId) throws JsonRpcInvalidParamsException; @JsonRpcMethod("eth_coinbase") @@ -227,7 +268,13 @@ String getABIofSmartContract(String contractAddress, String bnOrId) String gasPrice(); @JsonRpcMethod("eth_estimateGas") - String estimateGas(CallArguments args); + @JsonRpcErrors({ + @JsonRpcError(exception = JsonRpcInvalidRequestException.class, code = -32600, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInternalException.class, code = -32603, data = "{}"), + }) + String estimateGas(CallArguments args) throws JsonRpcInvalidRequestException, + JsonRpcInvalidParamsException, JsonRpcInternalException; @JsonRpcMethod("eth_getTransactionByHash") @JsonRpcErrors({ diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 511e6b69559..607a5515f99 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -11,7 +11,6 @@ import com.alibaba.fastjson.JSON; import com.google.protobuf.ByteString; import com.google.protobuf.GeneratedMessageV3; -import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -32,7 +31,9 @@ import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.TransactionCapsule; import org.tron.core.db.Manager; +import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; +import org.tron.core.exception.HeaderNotFound; import org.tron.core.exception.JsonRpcInternalException; import org.tron.core.exception.JsonRpcInvalidParamsException; import org.tron.core.exception.JsonRpcInvalidRequestException; @@ -208,8 +209,13 @@ public String getNetVersion() { } @Override - public String ethChainId() { - return ByteArray.toJsonHex(chainId); + public String ethChainId() throws JsonRpcInternalException { + // return hash of genesis block + try { + return ByteArray.toJsonHex(wallet.getBlockCapsuleByNum(0).getBlockId().getBytes()); + } catch (Exception e) { + throw new JsonRpcInternalException(e.getMessage()); + } } @Override @@ -256,11 +262,9 @@ public String getTrxBalance(String address, String blockNumOrTag) } } - /** - * @param data Hash of the method signature and encoded parameters. for example: - * getMethodSign(methodName(uint256,uint256)) || data1 || data2 - */ - private String call(byte[] ownerAddressByte, byte[] contractAddressByte, byte[] data) { + private void callTriggerConstantContract(byte[] ownerAddressByte, byte[] contractAddressByte, + byte[] data, TransactionExtention.Builder trxExtBuilder, Return.Builder retBuilder) + throws ContractValidateException, ContractExeException, HeaderNotFound, VMIllegalException { TriggerSmartContract triggerContract = triggerCallContract( ownerAddressByte, @@ -271,23 +275,31 @@ private String call(byte[] ownerAddressByte, byte[] contractAddressByte, byte[] null ); + TransactionCapsule trxCap = wallet.createTransactionCapsule(triggerContract, + ContractType.TriggerSmartContract); + Transaction trx = + wallet.triggerConstantContract(triggerContract, trxCap, trxExtBuilder, retBuilder); + + trxExtBuilder.setTransaction(trx); + trxExtBuilder.setTxid(trxCap.getTransactionId().getByteString()); + trxExtBuilder.setResult(retBuilder); + retBuilder.setResult(true).setCode(response_code.SUCCESS); + } + + /** + * @param data Hash of the method signature and encoded parameters. for example: + * getMethodSign(methodName(uint256,uint256)) || data1 || data2 + */ + private String call(byte[] ownerAddressByte, byte[] contractAddressByte, byte[] data) { + TransactionExtention.Builder trxExtBuilder = TransactionExtention.newBuilder(); Return.Builder retBuilder = Return.newBuilder(); TransactionExtention trxExt; try { - TransactionCapsule trxCap = wallet.createTransactionCapsule(triggerContract, - ContractType.TriggerSmartContract); - Transaction trx = wallet.triggerConstantContract( - triggerContract, - trxCap, - trxExtBuilder, + callTriggerConstantContract(ownerAddressByte, contractAddressByte, data, trxExtBuilder, retBuilder); - retBuilder.setResult(true).setCode(response_code.SUCCESS); - trxExtBuilder.setTransaction(trx); - trxExtBuilder.setTxid(trxCap.getTransactionId().getByteString()); - trxExtBuilder.setResult(retBuilder); } catch (ContractValidateException | VMIllegalException e) { retBuilder.setResult(false).setCode(response_code.CONTRACT_VALIDATE_ERROR) .setMessage(ByteString.copyFromUtf8(CONTRACT_VALIDATE_ERROR + e.getMessage())); @@ -349,7 +361,7 @@ public String getStorageAt(String address, String storageIdx, String blockNumOrT } @Override - public String getABIofSmartContract(String contractAddress, String blockNumOrTag) + public String getABIOfSmartContract(String contractAddress, String blockNumOrTag) throws JsonRpcInvalidParamsException { if ("earliest".equalsIgnoreCase(blockNumOrTag) || "pending".equalsIgnoreCase(blockNumOrTag)) { @@ -391,24 +403,36 @@ public String getCoinbase() throws JsonRpcInternalException { // return energy fee @Override public String gasPrice() { - BigInteger gasPrice; - // 1sun as 1 Gwei(1 eth = 10^9Gwei), return wei(1 eth=10^18 wei), so 1 sun as 10^9 wei - BigInteger multiplier = new BigInteger("1000000000", 10); - - gasPrice = BigInteger.valueOf(wallet.getEnergyFee()); - return "0x" + gasPrice.multiply(multiplier).toString(16); + return ByteArray.toJsonHex(wallet.getEnergyFee()); } @Override - public String estimateGas(CallArguments args) { - BigInteger feeLimit = BigInteger.valueOf(100); // set fee limit: 100 trx - BigInteger precision = new BigInteger("1000000000000000000"); // 1ether = 10^18 wei - BigInteger gasPrice = new BigInteger(gasPrice().substring(2), 16); - if (gasPrice.compareTo(BigInteger.ZERO) > 0) { - return "0x" + feeLimit.multiply(precision).divide(gasPrice).toString(16); - } else { + public String estimateGas(CallArguments args) throws JsonRpcInvalidRequestException, + JsonRpcInvalidParamsException, JsonRpcInternalException { + byte[] ownerAddress = addressHashToByteArray(args.from); + + ContractType contractType = args.getContractType(wallet); + if (contractType == ContractType.TransferContract) { + buildTransferContractTransaction(ownerAddress, new BuildArguments(args)); return "0x0"; } + + TransactionExtention.Builder trxExtBuilder = TransactionExtention.newBuilder(); + Return.Builder retBuilder = Return.newBuilder(); + + try { + callTriggerConstantContract(ownerAddress, + addressHashToByteArray(args.to), + ByteArray.fromHexString(args.data), + trxExtBuilder, + retBuilder); + + return ByteArray.toJsonHex(trxExtBuilder.getEnergyUsed()); + } catch (ContractValidateException e) { + throw new JsonRpcInvalidRequestException(e.getMessage()); + } catch (Exception e) { + throw new JsonRpcInternalException(e.getMessage()); + } } @Override From d5a14b2ad937d0022fb255714d1dae852af36cb4 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 19 Aug 2021 12:50:25 +0800 Subject: [PATCH 129/341] feat: buildTransaction use gas instead of feeLimit, chainId return chainId --- .../core/services/jsonrpc/BuildArguments.java | 30 +++++---- .../core/services/jsonrpc/CallArguments.java | 61 ++++++++++++++++++ .../core/services/jsonrpc/JsonRpcApiUtil.java | 22 +++++++ .../core/services/jsonrpc/TronJsonRpc.java | 63 +------------------ .../services/jsonrpc/TronJsonRpcImpl.java | 42 ++++++++----- .../org/tron/core/jsonrpc/JsonRpcTest.java | 2 +- 6 files changed, 124 insertions(+), 96 deletions(-) create mode 100644 framework/src/main/java/org/tron/core/services/jsonrpc/CallArguments.java diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java b/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java index 61550be5fe3..57f8798e0e3 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java @@ -1,6 +1,9 @@ package org.tron.core.services.jsonrpc; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.addressHashToByteArray; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.paramQuantityIsNull; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.paramStringIsNull; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.parseQuantityValue; import com.google.protobuf.ByteString; import lombok.AllArgsConstructor; @@ -8,11 +11,9 @@ import lombok.ToString; import org.apache.commons.lang3.StringUtils; import org.tron.api.GrpcAPI.BytesMessage; -import org.tron.common.utils.ByteArray; import org.tron.core.Wallet; import org.tron.core.exception.JsonRpcInvalidParamsException; import org.tron.core.exception.JsonRpcInvalidRequestException; -import org.tron.core.services.jsonrpc.TronJsonRpc.CallArguments; import org.tron.protos.Protocol.Transaction.Contract.ContractType; import org.tron.protos.contract.SmartContractOuterClass.SmartContract; @@ -23,7 +24,7 @@ public class BuildArguments { public String from; public String to; - public String gas = ""; //not used + public String gas = "0x0"; public String gasPrice = ""; //not used public String value; public String data; @@ -35,7 +36,6 @@ public class BuildArguments { public Long consumeUserResourcePercent = 0L; public Long originEnergyLimit = 0L; public String name = ""; - public Long feeLimit = 0L; public Integer permissionId = 0; public String extraData = ""; @@ -56,9 +56,9 @@ public ContractType getContractType(Wallet wallet) throws JsonRpcInvalidRequestE ContractType contractType; // to is null - if (StringUtils.isEmpty(to) || to.equals("0x")) { + if (paramStringIsNull(to)) { // data is null - if (StringUtils.isEmpty(data) || data.equals("0x")) { + if (paramStringIsNull(data)) { throw new JsonRpcInvalidRequestException("invalid json request"); } @@ -75,7 +75,7 @@ public ContractType getContractType(Wallet wallet) throws JsonRpcInvalidRequestE contractType = ContractType.TriggerSmartContract; } else { // tokenId and tokenValue: trc10, value: TRX - if (tokenId > 0 && tokenValue > 0 && (StringUtils.isEmpty(value) || value.equals("0x0"))) { + if (availableTransferAsset()) { contractType = ContractType.TransferAssetContract; } else { if (StringUtils.isNotEmpty(value)) { @@ -91,17 +91,15 @@ public ContractType getContractType(Wallet wallet) throws JsonRpcInvalidRequestE } public long parseValue() throws JsonRpcInvalidParamsException { - long callValue = 0L; + return parseQuantityValue(value); + } - if (StringUtils.isNotEmpty(value)) { - try { - callValue = ByteArray.jsonHexToLong(value); - } catch (Exception e) { - throw new JsonRpcInvalidParamsException("invalid param value: invalid hex number"); - } - } + public long parseGas() throws JsonRpcInvalidParamsException { + return parseQuantityValue(gas); + } - return callValue; + private boolean availableTransferAsset() { + return tokenId > 0 && tokenValue > 0 && paramQuantityIsNull(value); } } \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/CallArguments.java b/framework/src/main/java/org/tron/core/services/jsonrpc/CallArguments.java new file mode 100644 index 00000000000..6f026da5c7f --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/CallArguments.java @@ -0,0 +1,61 @@ +package org.tron.core.services.jsonrpc; + +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.addressHashToByteArray; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.paramStringIsNull; + +import com.google.protobuf.ByteString; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.ToString; +import org.apache.commons.lang3.StringUtils; +import org.tron.api.GrpcAPI.BytesMessage; +import org.tron.core.Wallet; +import org.tron.core.exception.JsonRpcInvalidParamsException; +import org.tron.core.exception.JsonRpcInvalidRequestException; +import org.tron.protos.Protocol.Transaction.Contract.ContractType; +import org.tron.protos.contract.SmartContractOuterClass.SmartContract; + +@NoArgsConstructor +@AllArgsConstructor +@ToString +public class CallArguments { + + public String from; + public String to; + public String gas = ""; //not used + public String gasPrice = ""; //not used + public String value = ""; //not used + public String data; + public String nonce; + + /** + * just support TransferContract and TriggerSmartContract + * */ + public ContractType getContractType(Wallet wallet) throws JsonRpcInvalidRequestException, + JsonRpcInvalidParamsException { + ContractType contractType; + + // from or to is null + if (paramStringIsNull(from) || paramStringIsNull(to)) { + throw new JsonRpcInvalidRequestException("invalid json request"); + } else { + byte[] contractAddressData = addressHashToByteArray(to); + BytesMessage.Builder build = BytesMessage.newBuilder(); + BytesMessage bytesMessage = + build.setValue(ByteString.copyFrom(contractAddressData)).build(); + SmartContract smartContract = wallet.getContract(bytesMessage); + + // check if to is smart contract + if (smartContract != null) { + contractType = ContractType.TriggerSmartContract; + } else { + if (StringUtils.isNotEmpty(value)) { + contractType = ContractType.TransferContract; + } else { + throw new JsonRpcInvalidRequestException("invalid json request"); + } + } + } + return contractType; + } +} \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index 89a965ffaf8..8bbdbee15e5 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -470,4 +470,26 @@ public static byte[] addressHashToByteArray(String hash) throws JsonRpcInvalidPa } return bHash; } + + public static boolean paramStringIsNull(String string) { + return StringUtils.isEmpty(string) || string.equals("0x"); + } + + public static boolean paramQuantityIsNull(String quantity) { + return StringUtils.isEmpty(quantity) || quantity.equals("0x0"); + } + + public static long parseQuantityValue(String value) throws JsonRpcInvalidParamsException { + long callValue = 0L; + + if (StringUtils.isNotEmpty(value)) { + try { + callValue = ByteArray.jsonHexToLong(value); + } catch (Exception e) { + throw new JsonRpcInvalidParamsException("invalid param value: invalid hex number"); + } + } + + return callValue; + } } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index fae2c3cca04..59f0a683399 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -84,64 +84,6 @@ public String toString() { } } - @NoArgsConstructor - @AllArgsConstructor - class CallArguments { - - public String from; - public String to; - public String gas = ""; //not used - public String gasPrice = ""; //not used - public String value = ""; //not used - public String data; - public String nonce; - - @Override - public String toString() { - return "CallArguments{" - + "from='" + from + '\'' - + ", to='" + to + '\'' - + ", gas='" + gas + '\'' - + ", gasPrice='" + gasPrice + '\'' - + ", value='" + value + '\'' - + ", data='" + data + '\'' - + ", nonce='" + nonce + '\'' - + '}'; - } - - /** - * just support TransferContract and TriggerSmartContract - * */ - public ContractType getContractType(Wallet wallet) throws JsonRpcInvalidRequestException, - JsonRpcInvalidParamsException { - ContractType contractType; - - // from or to is null - if (StringUtils.isEmpty(from) || from.equals("0x") - || StringUtils.isEmpty(to) || to.equals("0x")) { - throw new JsonRpcInvalidRequestException("invalid json request"); - } else { - byte[] contractAddressData = addressHashToByteArray(to); - BytesMessage.Builder build = BytesMessage.newBuilder(); - BytesMessage bytesMessage = - build.setValue(ByteString.copyFrom(contractAddressData)).build(); - SmartContract smartContract = wallet.getContract(bytesMessage); - - // check if to is smart contract - if (smartContract != null) { - contractType = ContractType.TriggerSmartContract; - } else { - if (StringUtils.isNotEmpty(value)) { - contractType = ContractType.TransferContract; - } else { - throw new JsonRpcInvalidRequestException("invalid json request"); - } - } - } - return contractType; - } - } - class CompilationResult { public String code; @@ -224,10 +166,7 @@ BlockResult ethGetBlockByNumber(String bnOrId, Boolean fullTransactionObjects) String getNetVersion(); @JsonRpcMethod("eth_chainId") - @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcInternalException.class, code = -32603, data = "{}"), - }) - String ethChainId() throws JsonRpcInternalException; + String ethChainId(); @JsonRpcMethod("net_listening") boolean isListening(); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 607a5515f99..729363d688e 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -209,13 +209,8 @@ public String getNetVersion() { } @Override - public String ethChainId() throws JsonRpcInternalException { - // return hash of genesis block - try { - return ByteArray.toJsonHex(wallet.getBlockCapsuleByNum(0).getBlockId().getBytes()); - } catch (Exception e) { - throw new JsonRpcInternalException(e.getMessage()); - } + public String ethChainId() { + return ByteArray.toJsonHex(chainId); } @Override @@ -431,7 +426,12 @@ public String estimateGas(CallArguments args) throws JsonRpcInvalidRequestExcept } catch (ContractValidateException e) { throw new JsonRpcInvalidRequestException(e.getMessage()); } catch (Exception e) { - throw new JsonRpcInternalException(e.getMessage()); + String errString = "invalid json request"; + if (e.getMessage() != null) { + errString = e.getMessage().replaceAll("[\"]", "\'"); + } + + throw new JsonRpcInternalException(errString); } } @@ -660,7 +660,8 @@ public String[] getAccounts() { } private TransactionJson buildCreateSmartContractTransaction(byte[] ownerAddress, - BuildArguments args) throws JsonRpcInvalidRequestException, JsonRpcInternalException { + BuildArguments args) throws JsonRpcInvalidParamsException, JsonRpcInvalidRequestException, + JsonRpcInternalException { try { CreateSmartContract.Builder build = CreateSmartContract.newBuilder(); @@ -671,11 +672,8 @@ private TransactionJson buildCreateSmartContractTransaction(byte[] ownerAddress, ABI.Builder abiBuilder = ABI.newBuilder(); if (StringUtils.isNotEmpty(args.abi)) { - StringBuffer abiSB = new StringBuffer("{"); - abiSB.append("\"entrys\":"); - abiSB.append(args.abi); - abiSB.append("}"); - JsonFormat.merge(abiSB.toString(), abiBuilder, args.visible); + String abiStr = "{" + "\"entrys\":" + args.abi + "}"; + JsonFormat.merge(abiStr, abiBuilder, args.visible); } SmartContract.Builder smartBuilder = SmartContract.newBuilder(); @@ -700,7 +698,7 @@ private TransactionJson buildCreateSmartContractTransaction(byte[] ownerAddress, .createTransactionCapsule(build.build(), ContractType.CreateSmartContract).getInstance(); Transaction.Builder txBuilder = tx.toBuilder(); Transaction.raw.Builder rawBuilder = tx.getRawData().toBuilder(); - rawBuilder.setFeeLimit(args.feeLimit); + rawBuilder.setFeeLimit(args.parseGas() * wallet.getEnergyFee()); txBuilder.setRawData(rawBuilder); tx = setTransactionPermissionId(args.permissionId, txBuilder.build()); @@ -709,6 +707,8 @@ private TransactionJson buildCreateSmartContractTransaction(byte[] ownerAddress, transactionJson.transaction = JSON.parseObject(Util.printCreateTransaction(tx, false)); return transactionJson; + } catch (JsonRpcInvalidParamsException e) { + throw new JsonRpcInvalidParamsException(e.getMessage()); } catch (ContractValidateException e) { throw new JsonRpcInvalidRequestException(e.getMessage()); } catch (Exception e) { @@ -746,7 +746,7 @@ private TransactionJson buildTriggerSmartContractTransaction(byte[] ownerAddress Transaction.Builder txBuilder = tx.toBuilder(); Transaction.raw.Builder rawBuilder = tx.getRawData().toBuilder(); - rawBuilder.setFeeLimit(args.feeLimit); + rawBuilder.setFeeLimit(args.parseGas() * wallet.getEnergyFee()); txBuilder.setRawData(rawBuilder); Transaction trx = wallet @@ -754,6 +754,8 @@ private TransactionJson buildTriggerSmartContractTransaction(byte[] ownerAddress retBuilder); trx = setTransactionPermissionId(args.permissionId, trx); trxExtBuilder.setTransaction(trx); + } catch (JsonRpcInvalidParamsException e) { + throw new JsonRpcInvalidParamsException(e.getMessage()); } catch (ContractValidateException e) { throw new JsonRpcInvalidRequestException(e.getMessage()); } catch (Exception e) { @@ -808,13 +810,19 @@ private TransactionJson buildTransferContractTransaction(byte[] ownerAddress, return createTransactionJson(build, ContractType.TransferContract, args); } + // tokenId and tokenValue should not be null private TransactionJson buildTransferAssetContractTransaction(byte[] ownerAddress, BuildArguments args) throws JsonRpcInvalidParamsException, JsonRpcInvalidRequestException, JsonRpcInternalException { + byte[] tokenIdArr = ByteArray.fromString(String.valueOf(args.tokenId)); + if (tokenIdArr == null) { + throw new JsonRpcInvalidParamsException("invalid param value: invalid tokenId"); + } + TransferAssetContract.Builder build = TransferAssetContract.newBuilder(); build.setOwnerAddress(ByteString.copyFrom(ownerAddress)) .setToAddress(ByteString.copyFrom(addressHashToByteArray(args.to))) - .setAssetName(ByteString.copyFrom(ByteArray.fromString(String.valueOf(args.tokenId)))) + .setAssetName(ByteString.copyFrom(tokenIdArr)) .setAmount(args.tokenValue); return createTransactionJson(build, ContractType.TransferAssetContract, args); diff --git a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java index c11f442b738..8ea3a3bf17d 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java @@ -9,7 +9,7 @@ import org.tron.common.utils.ByteArray; import org.tron.common.utils.ByteUtil; import org.tron.common.utils.Commons; -import org.tron.core.services.jsonrpc.TronJsonRpc.CallArguments; +import org.tron.core.services.jsonrpc.CallArguments; public class JsonRpcTest { From 8c822a89c18a27706ca96fd2f4f43419c9de28f6 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Thu, 19 Aug 2021 17:09:10 +0800 Subject: [PATCH 130/341] optimize the broadcast transaction interface --- .../common/parameter/CommonParameter.java | 4 +- .../src/main/java/org/tron/core/Constant.java | 2 + .../src/main/java/org/tron/core/Wallet.java | 33 ++++++++++----- .../java/org/tron/core/config/args/Args.java | 3 ++ .../org/tron/core/net/TronNetService.java | 5 +++ .../org/tron/core/net/service/AdvService.java | 42 ++++++++++++++++--- 6 files changed, 72 insertions(+), 17 deletions(-) diff --git a/common/src/main/java/org/tron/common/parameter/CommonParameter.java b/common/src/main/java/org/tron/common/parameter/CommonParameter.java index afdddf306e0..968f06e8872 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -296,7 +296,9 @@ public class CommonParameter { @Getter @Setter public int minEffectiveConnection; - + @Getter + @Setter + public boolean trxCacheEnable; @Getter @Setter public long allowMarketTransaction; //committee parameter diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index 890be85e2a0..c149cf9042d 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -169,6 +169,8 @@ public class Constant { public static final String NODE_RPC_MIN_EFFECTIVE_CONNECTION = "node.rpc.minEffectiveConnection"; + public static final String NODE_RPC_TRX_CACHE_ENABLE = "node.rpc.trxCacheEnable"; + public static final String ENERGY_LIMIT_BLOCK_NUM = "enery.limit.block.num"; public static final String VM_TRACE = "vm.vmTrace"; diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index 2d6a2febd93..f8b427a1114 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -226,6 +226,7 @@ import org.tron.protos.contract.SmartContractOuterClass.SmartContract; import org.tron.protos.contract.SmartContractOuterClass.SmartContractDataWrapper; import org.tron.protos.contract.SmartContractOuterClass.TriggerSmartContract; +import sun.awt.image.PixelConverter; @Slf4j @Component @@ -263,6 +264,7 @@ public class Wallet { @Autowired private NodeManager nodeManager; private int minEffectiveConnection = Args.getInstance().getMinEffectiveConnection(); + private boolean trxCacheEnable = Args.getInstance().isTrxCacheEnable(); public static final String CONTRACT_VALIDATE_EXCEPTION = "ContractValidateException: {}"; public static final String CONTRACT_VALIDATE_ERROR = "contract validate error : "; @@ -478,8 +480,9 @@ public GrpcAPI.Return broadcastTransaction(Transaction signedTransaction) { GrpcAPI.Return.Builder builder = GrpcAPI.Return.newBuilder(); TransactionCapsule trx = new TransactionCapsule(signedTransaction); trx.setTime(System.currentTimeMillis()); + Sha256Hash txID = trx.getTransactionId(); try { - Message message = new TransactionMessage(signedTransaction.toByteArray()); + TransactionMessage message = new TransactionMessage(signedTransaction.toByteArray()); if (minEffectiveConnection != 0) { if (tronNetDelegate.getActivePeer().isEmpty()) { logger @@ -509,22 +512,30 @@ public GrpcAPI.Return broadcastTransaction(Transaction signedTransaction) { return builder.setResult(false).setCode(response_code.SERVER_BUSY).build(); } - if (dbManager.getTransactionIdCache().getIfPresent(trx.getTransactionId()) != null) { - logger.warn("Broadcast transaction {} has failed, it already exists.", - trx.getTransactionId()); - return builder.setResult(false).setCode(response_code.DUP_TRANSACTION_ERROR).build(); - } else { - dbManager.getTransactionIdCache().put(trx.getTransactionId(), true); + if (trxCacheEnable) { + if (dbManager.getTransactionIdCache().getIfPresent(txID) != null) { + logger.warn("Broadcast transaction {} has failed, it already exists.", txID); + return builder.setResult(false).setCode(response_code.DUP_TRANSACTION_ERROR).build(); + } else { + dbManager.getTransactionIdCache().put(txID, true); + } } + if (chainBaseManager.getDynamicPropertiesStore().supportVM()) { trx.resetResult(); } dbManager.pushTransaction(trx); - tronNetService.broadcast(message); - logger.info("Broadcast transaction {} successfully.", trx.getTransactionId()); - return builder.setResult(true).setCode(response_code.SUCCESS).build(); + int n = tronNetService.fastBroadcastTransaction(message); + if (n == 0) { + return builder.setResult(false).setCode(response_code.NOT_ENOUGH_EFFECTIVE_CONNECTION) + .setMessage(ByteString.copyFromUtf8("p2p broadcast failed.")).build(); + } else { + logger.info("Broadcast transaction {} to {} peers successfully.", + trx.getTransactionId(), n); + return builder.setResult(true).setCode(response_code.SUCCESS).build(); + } } catch (ValidateSignatureException e) { - logger.error(BROADCAST_TRANS_FAILED, trx.getTransactionId(), e.getMessage()); + logger.error(BROADCAST_TRANS_FAILED, txID, e.getMessage()); return builder.setResult(false).setCode(response_code.SIGERROR) .setMessage(ByteString.copyFromUtf8("validate signature error " + e.getMessage())) .build(); diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index d159f1ad243..2892172d0af 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -610,6 +610,9 @@ public static void setParam(final String[] args, final String confFileName) { PARAMETER.minEffectiveConnection = config.hasPath(Constant.NODE_RPC_MIN_EFFECTIVE_CONNECTION) ? config.getInt(Constant.NODE_RPC_MIN_EFFECTIVE_CONNECTION) : 1; + PARAMETER.trxCacheEnable = config.hasPath(Constant.NODE_RPC_TRX_CACHE_ENABLE) + ? config.getBoolean(Constant.NODE_RPC_TRX_CACHE_ENABLE) : false; + PARAMETER.blockNumForEnergyLimit = config.hasPath(Constant.ENERGY_LIMIT_BLOCK_NUM) ? config.getInt(Constant.ENERGY_LIMIT_BLOCK_NUM) : 4727890L; diff --git a/framework/src/main/java/org/tron/core/net/TronNetService.java b/framework/src/main/java/org/tron/core/net/TronNetService.java index 094e452f444..15d5173774a 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetService.java +++ b/framework/src/main/java/org/tron/core/net/TronNetService.java @@ -8,6 +8,7 @@ import org.tron.core.exception.P2pException; import org.tron.core.exception.P2pException.TypeEnum; import org.tron.core.net.message.BlockMessage; +import org.tron.core.net.message.TransactionMessage; import org.tron.core.net.message.TronMessage; import org.tron.core.net.messagehandler.BlockMsgHandler; import org.tron.core.net.messagehandler.ChainInventoryMsgHandler; @@ -78,6 +79,10 @@ public void stop() { logger.info("TronNetService closed successfully."); } + public int fastBroadcastTransaction(TransactionMessage msg) { + return advService.fastBroadcastTransaction(msg); + } + public void broadcast(Message msg) { advService.broadcast(msg); } diff --git a/framework/src/main/java/org/tron/core/net/service/AdvService.java b/framework/src/main/java/org/tron/core/net/service/AdvService.java index 46c0f4c883a..78288ce383d 100644 --- a/framework/src/main/java/org/tron/core/net/service/AdvService.java +++ b/framework/src/main/java/org/tron/core/net/service/AdvService.java @@ -6,11 +6,8 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; -import java.util.Collection; -import java.util.Comparator; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; + +import java.util.*; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; @@ -19,6 +16,7 @@ import java.util.stream.Collectors; import lombok.Getter; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.binary.Hex; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.tron.common.overlay.discover.node.statistics.MessageCount; @@ -141,6 +139,40 @@ public Message getMessage(Item item) { } } + public int fastBroadcastTransaction(TransactionMessage msg) { + + List peers = tronNetDelegate.getActivePeer().stream() + .filter(peer -> !peer.isNeedSyncFromPeer() && !peer.isNeedSyncFromUs()) + .collect(Collectors.toList()); + + if (peers.size() == 0) { + logger.warn("Broadcast transaction {} failed, no connection.", msg.getMessageId()); + return 0; + } + + Item item = new Item(msg.getMessageId(), InventoryType.TRX); + trxCount.add(); + trxCache.put(item, new TransactionMessage(msg.getTransactionCapsule().getInstance())); + + List list = new ArrayList<>(); + list.add(msg.getMessageId()); + InventoryMessage inventoryMessage = new InventoryMessage(list, InventoryType.TRX); + + int peersCount = 0; + for (PeerConnection peer: peers) { + if (peer.getAdvInvReceive().getIfPresent(item) == null + && peer.getAdvInvSpread().getIfPresent(item) == null) { + peersCount++; + peer.getAdvInvSpread().put(item, Time.getCurrentMillis()); + peer.fastSend(inventoryMessage); + } + } + if (peersCount == 0) { + logger.warn("Broadcast transaction {} failed, no peers.", msg.getMessageId()); + } + return peersCount; + } + public void broadcast(Message msg) { if (fastForward) { From a4b262b1643b23a586be201d661a5851a1d691ca Mon Sep 17 00:00:00 2001 From: wubin01 Date: Thu, 19 Aug 2021 17:18:18 +0800 Subject: [PATCH 131/341] optimize brocast transaction log --- .../src/main/java/org/tron/core/Wallet.java | 31 +++++++++---------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index f8b427a1114..76c187ca994 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -485,8 +485,7 @@ public GrpcAPI.Return broadcastTransaction(Transaction signedTransaction) { TransactionMessage message = new TransactionMessage(signedTransaction.toByteArray()); if (minEffectiveConnection != 0) { if (tronNetDelegate.getActivePeer().isEmpty()) { - logger - .warn("Broadcast transaction {} has failed, no connection.", trx.getTransactionId()); + logger.warn("Broadcast transaction {} has failed, no connection.", txID); return builder.setResult(false).setCode(response_code.NO_CONNECTION) .setMessage(ByteString.copyFromUtf8("no connection")) .build(); @@ -499,7 +498,7 @@ public GrpcAPI.Return broadcastTransaction(Transaction signedTransaction) { if (count < minEffectiveConnection) { String info = "effective connection:" + count + " lt minEffectiveConnection:" + minEffectiveConnection; - logger.warn("Broadcast transaction {} has failed, {}.", trx.getTransactionId(), info); + logger.warn("Broadcast transaction {} has failed, {}.", txID, info); return builder.setResult(false).setCode(response_code.NOT_ENOUGH_EFFECTIVE_CONNECTION) .setMessage(ByteString.copyFromUtf8(info)) .build(); @@ -507,8 +506,7 @@ public GrpcAPI.Return broadcastTransaction(Transaction signedTransaction) { } if (dbManager.isTooManyPending()) { - logger - .warn("Broadcast transaction {} has failed, too many pending.", trx.getTransactionId()); + logger.warn("Broadcast transaction {} has failed, too many pending.", txID); return builder.setResult(false).setCode(response_code.SERVER_BUSY).build(); } @@ -525,13 +523,12 @@ public GrpcAPI.Return broadcastTransaction(Transaction signedTransaction) { trx.resetResult(); } dbManager.pushTransaction(trx); - int n = tronNetService.fastBroadcastTransaction(message); - if (n == 0) { + int num = tronNetService.fastBroadcastTransaction(message); + if (num == 0) { return builder.setResult(false).setCode(response_code.NOT_ENOUGH_EFFECTIVE_CONNECTION) .setMessage(ByteString.copyFromUtf8("p2p broadcast failed.")).build(); } else { - logger.info("Broadcast transaction {} to {} peers successfully.", - trx.getTransactionId(), n); + logger.info("Broadcast transaction {} to {} peers successfully.", txID, num); return builder.setResult(true).setCode(response_code.SUCCESS).build(); } } catch (ValidateSignatureException e) { @@ -540,42 +537,42 @@ public GrpcAPI.Return broadcastTransaction(Transaction signedTransaction) { .setMessage(ByteString.copyFromUtf8("validate signature error " + e.getMessage())) .build(); } catch (ContractValidateException e) { - logger.error(BROADCAST_TRANS_FAILED, trx.getTransactionId(), e.getMessage()); + logger.error(BROADCAST_TRANS_FAILED, txID, e.getMessage()); return builder.setResult(false).setCode(response_code.CONTRACT_VALIDATE_ERROR) .setMessage(ByteString.copyFromUtf8(CONTRACT_VALIDATE_ERROR + e.getMessage())) .build(); } catch (ContractExeException e) { - logger.error(BROADCAST_TRANS_FAILED, trx.getTransactionId(), e.getMessage()); + logger.error(BROADCAST_TRANS_FAILED, txID, e.getMessage()); return builder.setResult(false).setCode(response_code.CONTRACT_EXE_ERROR) .setMessage(ByteString.copyFromUtf8("contract execute error : " + e.getMessage())) .build(); } catch (AccountResourceInsufficientException e) { - logger.error(BROADCAST_TRANS_FAILED, trx.getTransactionId(), e.getMessage()); + logger.error(BROADCAST_TRANS_FAILED, txID, e.getMessage()); return builder.setResult(false).setCode(response_code.BANDWITH_ERROR) .setMessage(ByteString.copyFromUtf8("AccountResourceInsufficient error")) .build(); } catch (DupTransactionException e) { - logger.error(BROADCAST_TRANS_FAILED, trx.getTransactionId(), e.getMessage()); + logger.error(BROADCAST_TRANS_FAILED, txID, e.getMessage()); return builder.setResult(false).setCode(response_code.DUP_TRANSACTION_ERROR) .setMessage(ByteString.copyFromUtf8("dup transaction")) .build(); } catch (TaposException e) { - logger.error(BROADCAST_TRANS_FAILED, trx.getTransactionId(), e.getMessage()); + logger.error(BROADCAST_TRANS_FAILED, txID, e.getMessage()); return builder.setResult(false).setCode(response_code.TAPOS_ERROR) .setMessage(ByteString.copyFromUtf8("Tapos check error")) .build(); } catch (TooBigTransactionException e) { - logger.error(BROADCAST_TRANS_FAILED, trx.getTransactionId(), e.getMessage()); + logger.error(BROADCAST_TRANS_FAILED, txID, e.getMessage()); return builder.setResult(false).setCode(response_code.TOO_BIG_TRANSACTION_ERROR) .setMessage(ByteString.copyFromUtf8("transaction size is too big")) .build(); } catch (TransactionExpirationException e) { - logger.error(BROADCAST_TRANS_FAILED, trx.getTransactionId(), e.getMessage()); + logger.error(BROADCAST_TRANS_FAILED, txID, e.getMessage()); return builder.setResult(false).setCode(response_code.TRANSACTION_EXPIRATION_ERROR) .setMessage(ByteString.copyFromUtf8("transaction expired")) .build(); } catch (Exception e) { - logger.error(BROADCAST_TRANS_FAILED, trx.getTransactionId(), e.getMessage()); + logger.error(BROADCAST_TRANS_FAILED, txID, e.getMessage()); return builder.setResult(false).setCode(response_code.OTHER_ERROR) .setMessage(ByteString.copyFromUtf8("other error : " + e.getMessage())) .build(); From 53f0ee1bee6fbbdba75bd703870ef21895dd8391 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Thu, 19 Aug 2021 17:42:55 +0800 Subject: [PATCH 132/341] solve checkstyle problem --- framework/src/main/java/org/tron/core/Wallet.java | 1 - .../main/java/org/tron/core/net/service/AdvService.java | 8 ++++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index 76c187ca994..67005828400 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -226,7 +226,6 @@ import org.tron.protos.contract.SmartContractOuterClass.SmartContract; import org.tron.protos.contract.SmartContractOuterClass.SmartContractDataWrapper; import org.tron.protos.contract.SmartContractOuterClass.TriggerSmartContract; -import sun.awt.image.PixelConverter; @Slf4j @Component diff --git a/framework/src/main/java/org/tron/core/net/service/AdvService.java b/framework/src/main/java/org/tron/core/net/service/AdvService.java index 78288ce383d..64c9ec79e99 100644 --- a/framework/src/main/java/org/tron/core/net/service/AdvService.java +++ b/framework/src/main/java/org/tron/core/net/service/AdvService.java @@ -7,7 +7,12 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; @@ -16,7 +21,6 @@ import java.util.stream.Collectors; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.codec.binary.Hex; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.tron.common.overlay.discover.node.statistics.MessageCount; From 84b2af647e51f947875d759e2ff5f80abc11c1c3 Mon Sep 17 00:00:00 2001 From: neo hong Date: Thu, 19 Aug 2021 18:01:01 +0800 Subject: [PATCH 133/341] add ALLOW_TVM_COMPATIBLE_EVM and ALLOW_TVM_LONDON proposals --- .../org/tron/core/utils/ProposalUtil.java | 29 ++++++++++++++++-- .../org/tron/core/vm/config/ConfigLoader.java | 2 ++ .../org/tron/core/vm/config/VMConfig.java | 20 +++++++++++++ .../org/tron/core/vm/program/Program.java | 13 ++++++++ .../core/store/DynamicPropertiesStore.java | 30 +++++++++++++++++++ .../common/parameter/CommonParameter.java | 8 +++++ .../src/main/java/org/tron/core/Constant.java | 3 ++ .../src/main/java/org/tron/core/Wallet.java | 8 +++++ .../java/org/tron/core/config/args/Args.java | 10 +++++++ .../tron/core/consensus/ProposalService.java | 8 +++++ 10 files changed, 129 insertions(+), 2 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java b/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java index a8e59966e81..bdb161d52ff 100644 --- a/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java +++ b/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java @@ -469,7 +469,30 @@ public static void validator(DynamicPropertiesStore dynamicPropertiesStore, } break; } - + case ALLOW_TVM_LONDON: { + // todo version modify + if (!forkController.pass(ForkBlockVersionEnum.VERSION_4_3)) { + throw new ContractValidateException( + "Bad chain parameter id [ALLOW_TVM_LONDON]"); + } + if (value != 1) { + throw new ContractValidateException( + "This value[ALLOW_TVM_LONDON] is only allowed to be 1"); + } + break; + } + case ALLOW_TVM_COMPATIBLE_EVM: { + // todo version modify + if (!forkController.pass(ForkBlockVersionEnum.VERSION_4_3)) { + throw new ContractValidateException( + "Bad chain parameter id [ALLOW_TVM_COMPATIBLE_EVM]"); + } + if (value != 1) { + throw new ContractValidateException( + "This value[ALLOW_TVM_COMPATIBLE_EVM] is only allowed to be 1"); + } + break; + } case FREE_NET_LIMIT: { if (!forkController.pass(ForkBlockVersionEnum.VERSION_4_3)) { throw new ContractValidateException("Bad chain parameter id [FREE_NET_LIMIT]"); @@ -560,8 +583,10 @@ public enum ProposalType { // current value, value range ALLOW_ACCOUNT_ASSET_OPTIMIZATION(53), // 1 // ALLOW_NEW_REWARD_ALGORITHM(58), // 0, 1 ALLOW_TVM_VOTE(59), // 0, 1 + ALLOW_TVM_COMPATIBLE_EVM(60), FREE_NET_LIMIT(61), // 5000, [0, 100_000] - TOTAL_NET_LIMIT(62); // 43_200_000_000L, [0, 1000_000_000_000L] + TOTAL_NET_LIMIT(62), // 43_200_000_000L, [0, 1000_000_000_000L] + ALLOW_TVM_LONDON(63); private long code; diff --git a/actuator/src/main/java/org/tron/core/vm/config/ConfigLoader.java b/actuator/src/main/java/org/tron/core/vm/config/ConfigLoader.java index dd0be2ad5d0..00f2bacedfc 100644 --- a/actuator/src/main/java/org/tron/core/vm/config/ConfigLoader.java +++ b/actuator/src/main/java/org/tron/core/vm/config/ConfigLoader.java @@ -28,6 +28,8 @@ public static void load(StoreFactory storeFactory) { VMConfig.initAllowTvmIstanbul(ds.getAllowTvmIstanbul()); VMConfig.initAllowTvmFreeze(ds.getAllowTvmFreeze()); VMConfig.initAllowTvmVote(ds.getAllowTvmVote()); + VMConfig.initAllowTvmLondon(ds.getAllowTvmLondon()); + VMConfig.initAllowTvmCompatibleEvm(ds.getAllowTvmCompatibleEvm()); } } } diff --git a/actuator/src/main/java/org/tron/core/vm/config/VMConfig.java b/actuator/src/main/java/org/tron/core/vm/config/VMConfig.java index b34986e6ba3..d0447c9c83d 100644 --- a/actuator/src/main/java/org/tron/core/vm/config/VMConfig.java +++ b/actuator/src/main/java/org/tron/core/vm/config/VMConfig.java @@ -51,6 +51,10 @@ public class VMConfig { private static boolean ALLOW_TVM_VOTE = false; + private static boolean ALLOW_TVM_LONDON = false; + + private static boolean ALLOW_TVM_COMPATIBLE_EVM = false; + private VMConfig() { } @@ -102,6 +106,14 @@ public static void initAllowTvmVote(long allow) { ALLOW_TVM_VOTE = allow == 1; } + public static void initAllowTvmLondon(long allow) { + ALLOW_TVM_LONDON = allow == 1; + } + + public static void initAllowTvmCompatibleEvm(long allow) { + ALLOW_TVM_COMPATIBLE_EVM = allow == 1; + } + public static boolean getEnergyLimitHardFork() { return ENERGY_LIMIT_HARD_FORK; } @@ -136,6 +148,14 @@ public static boolean allowTvmVote() { return ALLOW_TVM_VOTE; } + public static boolean allowTvmLondon() { + return ALLOW_TVM_LONDON; + } + + public static boolean allowTvmCompatibleEvm() { + return ALLOW_TVM_COMPATIBLE_EVM; + } + private static class SystemPropertiesInstance { private static final VMConfig INSTANCE = new VMConfig(); diff --git a/actuator/src/main/java/org/tron/core/vm/program/Program.java b/actuator/src/main/java/org/tron/core/vm/program/Program.java index fd89c55bcb7..a1684401192 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/Program.java +++ b/actuator/src/main/java/org/tron/core/vm/program/Program.java @@ -25,6 +25,7 @@ import static org.apache.commons.lang3.ArrayUtils.isEmpty; import static org.apache.commons.lang3.ArrayUtils.isNotEmpty; import static org.apache.commons.lang3.ArrayUtils.nullToEmpty; +import static org.tron.common.utils.ByteUtil.intToBytes; import static org.tron.common.utils.ByteUtil.stripLeadingZeroes; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; @@ -787,6 +788,13 @@ this, new DataWord(newAddress), getContractAddress(), value, new DataWord(0), // 4. CREATE THE CONTRACT OUT OF RETURN byte[] code = createResult.getHReturn(); + if (config.allowTvmLondon() && code[0] == (byte) 0xEF) { + if (null == createResult.getException()) { + createResult.setException(Program.Exception + .invalidOpCode((byte) 0xEF)); + } + } + long saveCodeEnergy = (long) getLength(code) * EnergyCost.getInstance().getCREATE_DATA(); long afterSpend = @@ -1650,6 +1658,11 @@ public void checkTokenIdInTokenBalance(DataWord tokenIdDataWord) { } public DataWord getCallEnergy(OpCode op, DataWord requestedEnergy, DataWord availableEnergy) { + // todo version fork + if (VMConfig.allowTvmCompatibleEvm()) { + availableEnergy.div(new DataWord(intToBytes(64))); + availableEnergy.sub(availableEnergy); + } return requestedEnergy.compareTo(availableEnergy) > 0 ? availableEnergy : requestedEnergy; } diff --git a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java index c67e2938987..c614953ab86 100644 --- a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java +++ b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java @@ -156,6 +156,8 @@ public class DynamicPropertiesStore extends TronStoreWithRevoking private static final byte[] ALLOW_NEW_RESOURCE_MODEL = "ALLOW_NEW_RESOURCE_MODEL".getBytes(); private static final byte[] ALLOW_TVM_FREEZE = "ALLOW_TVM_FREEZE".getBytes(); private static final byte[] ALLOW_TVM_VOTE = "ALLOW_TVM_VOTE".getBytes(); + private static final byte[] ALLOW_TVM_LONDON = "ALLOW_TVM_LONDON".getBytes(); + private static final byte[] ALLOW_TVM_COMPATIBLE_EVM = "ALLOW_TVM_COMPATIBLE_EVM".getBytes(); private static final byte[] NEW_REWARD_ALGORITHM_EFFECTIVE_CYCLE = "NEW_REWARD_ALGORITHM_EFFECTIVE_CYCLE".getBytes(); //This value is only allowed to be 1 @@ -2255,6 +2257,34 @@ public long getAllowTvmVote() { () -> new IllegalArgumentException(msg)); } + public void saveAllowTvmLondon(long allowTvmLondon) { + this.put(DynamicPropertiesStore.ALLOW_TVM_LONDON, + new BytesCapsule(ByteArray.fromLong(allowTvmLondon))); + } + + public long getAllowTvmLondon() { + String msg = "not found ALLOW_TVM_LONDON"; + return Optional.ofNullable(getUnchecked(ALLOW_TVM_LONDON)) + .map(BytesCapsule::getData) + .map(ByteArray::toLong) + .orElseThrow( + () -> new IllegalArgumentException(msg)); + } + + public void saveAllowTvmCompatibleEvm(long allowTvmCompatibleEvm) { + this.put(DynamicPropertiesStore.ALLOW_TVM_COMPATIBLE_EVM, + new BytesCapsule(ByteArray.fromLong(allowTvmCompatibleEvm))); + } + + public long getAllowTvmCompatibleEvm() { + String msg = "not found ALLOW_TVM_COMPATIBLE_EVM"; + return Optional.ofNullable(getUnchecked(ALLOW_TVM_COMPATIBLE_EVM)) + .map(BytesCapsule::getData) + .map(ByteArray::toLong) + .orElseThrow( + () -> new IllegalArgumentException(msg)); + } + public boolean useNewRewardAlgorithm() { return getAllowTvmVote() == 1; } diff --git a/common/src/main/java/org/tron/common/parameter/CommonParameter.java b/common/src/main/java/org/tron/common/parameter/CommonParameter.java index afdddf306e0..7529a256480 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -452,6 +452,14 @@ public class CommonParameter { @Setter public long allowTvmVote; + @Getter + @Setter + public long allowTvmLondon; + + @Getter + @Setter + public long allowTvmCompatibleEvm; + @Getter @Setter public boolean openHistoryQueryWhenLiteFN = false; diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index 890be85e2a0..00c7f440dce 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -267,6 +267,9 @@ public class Constant { public static final String COMMITTEE_ALLOW_TVM_FREEZE = "committee.allowTvmFreeze"; public static final String COMMITTEE_ALLOW_TVM_VOTE = "committee.allowTvmVote"; + public static final String COMMITTEE_ALLOW_TVM_LONDON = "committee.allowTvmLondon"; + public static final String COMMITTEE_ALLOW_TVM_COMPATIBLE_EVM = "committee.allowTvmCompatibleEvm"; + public static final String METRICS_STORAGE_ENABLE = "node.metrics.storageEnable"; public static final String METRICS_INFLUXDB_IP = "node.metrics.influxdb.ip"; public static final String METRICS_INFLUXDB_PORT = "node.metrics.influxdb.port"; diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index 2d6a2febd93..073ad81cf5a 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -1007,6 +1007,14 @@ public Protocol.ChainParameters getChainParameters() { .setValue(dbManager.getDynamicPropertiesStore().getAllowTvmVote()) .build()); + builder.addChainParameter( + Protocol.ChainParameters.ChainParameter.newBuilder().setKey("getAllowTvmLondon") + .setValue(dbManager.getDynamicPropertiesStore().getAllowTvmLondon()).build()); + + builder.addChainParameter( + Protocol.ChainParameters.ChainParameter.newBuilder().setKey("getAllowTvmCompatibleEvm") + .setValue(dbManager.getDynamicPropertiesStore().getAllowTvmCompatibleEvm()).build()); + builder.addChainParameter(Protocol.ChainParameters.ChainParameter.newBuilder() .setKey("getAllowAccountAssetOptimization") .setValue(dbManager.getDynamicPropertiesStore().getAllowAccountAssetOptimization()) diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index d159f1ad243..b95c623fb46 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -185,6 +185,8 @@ public static void clearParam() { PARAMETER.allowTvmIstanbul = 0; PARAMETER.allowTvmFreeze = 0; PARAMETER.allowTvmVote = 0; + PARAMETER.allowTvmLondon = 0; + PARAMETER.allowTvmCompatibleEvm = 0; PARAMETER.historyBalanceLookup = false; PARAMETER.openPrintLog = true; PARAMETER.openTransactionSort = false; @@ -717,6 +719,14 @@ public static void setParam(final String[] args, final String confFileName) { config.hasPath(Constant.COMMITTEE_ALLOW_TVM_VOTE) ? config .getInt(Constant.COMMITTEE_ALLOW_TVM_VOTE) : 0; + PARAMETER.allowTvmLondon = + config.hasPath(Constant.COMMITTEE_ALLOW_TVM_LONDON) ? config + .getInt(Constant.COMMITTEE_ALLOW_TVM_LONDON) : 0; + + PARAMETER.allowTvmCompatibleEvm = + config.hasPath(Constant.COMMITTEE_ALLOW_TVM_COMPATIBLE_EVM) ? config + .getInt(Constant.COMMITTEE_ALLOW_TVM_COMPATIBLE_EVM) : 0; + initBackupProperty(config); if (Constant.ROCKSDB.equals(CommonParameter .getInstance().getStorage().getDbEngine().toUpperCase())) { diff --git a/framework/src/main/java/org/tron/core/consensus/ProposalService.java b/framework/src/main/java/org/tron/core/consensus/ProposalService.java index 4f40473a3c0..bee165f9389 100644 --- a/framework/src/main/java/org/tron/core/consensus/ProposalService.java +++ b/framework/src/main/java/org/tron/core/consensus/ProposalService.java @@ -247,6 +247,14 @@ public static boolean process(Manager manager, ProposalCapsule proposalCapsule) manager.getDynamicPropertiesStore().saveNewRewardAlgorithmEffectiveCycle(); break; } + case ALLOW_TVM_LONDON: { + manager.getDynamicPropertiesStore().saveAllowTvmLondon(entry.getValue()); + break; + } + case ALLOW_TVM_COMPATIBLE_EVM: { + manager.getDynamicPropertiesStore().saveAllowTvmCompatibleEvm(entry.getValue()); + break; + } case FREE_NET_LIMIT: { manager.getDynamicPropertiesStore().saveFreeNetLimit(entry.getValue()); break; From 9d4c18e0b8f8fddd18c60818fb6740fb81fe8ebb Mon Sep 17 00:00:00 2001 From: liukai Date: Mon, 23 Aug 2021 15:33:57 +0800 Subject: [PATCH 134/341] modify -men opt --- start.sh | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/start.sh b/start.sh index 9cc5546a876..45a26814730 100644 --- a/start.sh +++ b/start.sh @@ -44,7 +44,7 @@ checkmemory() { allow_memory=8000000 allow_max_memory=48000000 max_matespace_size=' -xx:maxmetaspacesize=512m ' - total=`cat /proc/meminfo |grep memtotal |awk -f ' ' '{print $2}'` + total=`cat /proc/meminfo |grep MemTotal |awk -F ' ' '{print $2}'` default_memory=true position=0 @@ -66,8 +66,7 @@ checkmemory() { done if [ $default_memory == true ]; then - # total < allow_mem - if [ $total -lt $allow_memory ] ; then + if [[ $total -lt $allow_memory ]] ; then echo "direct memory must be greater than $allow_memory!, current memory: $total!!" exit fi @@ -81,11 +80,16 @@ checkmemory() { fi else NEW_RATIO=2 - max_matespace_size=$allow_memory / 16 + max_matespace_size=$[allow_memory / 16] MEM_OPT="$max_matespace_size $new_ratio" fi } +if [[ $APP =~ '-' ]]; then + APP='' +fi + + APP=${APP:-"FullNode"} START_OPT=`echo ${@:2}` JAR_NAME="$APP.jar" @@ -125,8 +129,6 @@ checkPath(){ fi } - - stopService() { count=1 while [ $count -le $MAX_STOP_TIME ]; do @@ -160,6 +162,7 @@ startService() { echo "start java-tron with pid $pid on $HOSTNAME" } + stopService checkPath if [[ 0 == $? ]] ; then @@ -169,4 +172,4 @@ else fi sleep 5 checkmemory -startService +startService \ No newline at end of file From a038d9d76a607c1f9e4256e7b5ae3e743be0efba Mon Sep 17 00:00:00 2001 From: wubin01 Date: Mon, 23 Aug 2021 16:13:19 +0800 Subject: [PATCH 135/341] optimize the broadcast transaction interface log --- .../src/main/java/org/tron/core/Wallet.java | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index 67005828400..0cb4db0ca51 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -265,7 +265,7 @@ public class Wallet { private int minEffectiveConnection = Args.getInstance().getMinEffectiveConnection(); private boolean trxCacheEnable = Args.getInstance().isTrxCacheEnable(); public static final String CONTRACT_VALIDATE_EXCEPTION = "ContractValidateException: {}"; - public static final String CONTRACT_VALIDATE_ERROR = "contract validate error : "; + public static final String CONTRACT_VALIDATE_ERROR = "Contract validate error : "; @Autowired private TransactionUtil transactionUtil; @@ -486,7 +486,7 @@ public GrpcAPI.Return broadcastTransaction(Transaction signedTransaction) { if (tronNetDelegate.getActivePeer().isEmpty()) { logger.warn("Broadcast transaction {} has failed, no connection.", txID); return builder.setResult(false).setCode(response_code.NO_CONNECTION) - .setMessage(ByteString.copyFromUtf8("no connection")) + .setMessage(ByteString.copyFromUtf8("No connection.")) .build(); } @@ -495,9 +495,9 @@ public GrpcAPI.Return broadcastTransaction(Transaction signedTransaction) { .count(); if (count < minEffectiveConnection) { - String info = "effective connection:" + count + " lt minEffectiveConnection:" + String info = "Effective connection:" + count + " lt minEffectiveConnection:" + minEffectiveConnection; - logger.warn("Broadcast transaction {} has failed, {}.", txID, info); + logger.warn("Broadcast transaction {} has failed. {}.", txID, info); return builder.setResult(false).setCode(response_code.NOT_ENOUGH_EFFECTIVE_CONNECTION) .setMessage(ByteString.copyFromUtf8(info)) .build(); @@ -506,13 +506,15 @@ public GrpcAPI.Return broadcastTransaction(Transaction signedTransaction) { if (dbManager.isTooManyPending()) { logger.warn("Broadcast transaction {} has failed, too many pending.", txID); - return builder.setResult(false).setCode(response_code.SERVER_BUSY).build(); + return builder.setResult(false).setCode(response_code.SERVER_BUSY) + .setMessage(ByteString.copyFromUtf8("Server busy.")).build(); } if (trxCacheEnable) { if (dbManager.getTransactionIdCache().getIfPresent(txID) != null) { logger.warn("Broadcast transaction {} has failed, it already exists.", txID); - return builder.setResult(false).setCode(response_code.DUP_TRANSACTION_ERROR).build(); + return builder.setResult(false).setCode(response_code.DUP_TRANSACTION_ERROR) + .setMessage(ByteString.copyFromUtf8("Transaction already exists.")).build(); } else { dbManager.getTransactionIdCache().put(txID, true); } @@ -525,7 +527,7 @@ public GrpcAPI.Return broadcastTransaction(Transaction signedTransaction) { int num = tronNetService.fastBroadcastTransaction(message); if (num == 0) { return builder.setResult(false).setCode(response_code.NOT_ENOUGH_EFFECTIVE_CONNECTION) - .setMessage(ByteString.copyFromUtf8("p2p broadcast failed.")).build(); + .setMessage(ByteString.copyFromUtf8("P2P broadcast failed.")).build(); } else { logger.info("Broadcast transaction {} to {} peers successfully.", txID, num); return builder.setResult(true).setCode(response_code.SUCCESS).build(); @@ -533,7 +535,7 @@ public GrpcAPI.Return broadcastTransaction(Transaction signedTransaction) { } catch (ValidateSignatureException e) { logger.error(BROADCAST_TRANS_FAILED, txID, e.getMessage()); return builder.setResult(false).setCode(response_code.SIGERROR) - .setMessage(ByteString.copyFromUtf8("validate signature error " + e.getMessage())) + .setMessage(ByteString.copyFromUtf8("Validate signature error: " + e.getMessage())) .build(); } catch (ContractValidateException e) { logger.error(BROADCAST_TRANS_FAILED, txID, e.getMessage()); @@ -543,37 +545,37 @@ public GrpcAPI.Return broadcastTransaction(Transaction signedTransaction) { } catch (ContractExeException e) { logger.error(BROADCAST_TRANS_FAILED, txID, e.getMessage()); return builder.setResult(false).setCode(response_code.CONTRACT_EXE_ERROR) - .setMessage(ByteString.copyFromUtf8("contract execute error : " + e.getMessage())) + .setMessage(ByteString.copyFromUtf8("Contract execute error : " + e.getMessage())) .build(); } catch (AccountResourceInsufficientException e) { logger.error(BROADCAST_TRANS_FAILED, txID, e.getMessage()); return builder.setResult(false).setCode(response_code.BANDWITH_ERROR) - .setMessage(ByteString.copyFromUtf8("AccountResourceInsufficient error")) + .setMessage(ByteString.copyFromUtf8("Account resource insufficient error.")) .build(); } catch (DupTransactionException e) { logger.error(BROADCAST_TRANS_FAILED, txID, e.getMessage()); return builder.setResult(false).setCode(response_code.DUP_TRANSACTION_ERROR) - .setMessage(ByteString.copyFromUtf8("dup transaction")) + .setMessage(ByteString.copyFromUtf8("Dup transaction.")) .build(); } catch (TaposException e) { logger.error(BROADCAST_TRANS_FAILED, txID, e.getMessage()); return builder.setResult(false).setCode(response_code.TAPOS_ERROR) - .setMessage(ByteString.copyFromUtf8("Tapos check error")) + .setMessage(ByteString.copyFromUtf8("Tapos check error.")) .build(); } catch (TooBigTransactionException e) { logger.error(BROADCAST_TRANS_FAILED, txID, e.getMessage()); return builder.setResult(false).setCode(response_code.TOO_BIG_TRANSACTION_ERROR) - .setMessage(ByteString.copyFromUtf8("transaction size is too big")) + .setMessage(ByteString.copyFromUtf8("Transaction size is too big.")) .build(); } catch (TransactionExpirationException e) { logger.error(BROADCAST_TRANS_FAILED, txID, e.getMessage()); return builder.setResult(false).setCode(response_code.TRANSACTION_EXPIRATION_ERROR) - .setMessage(ByteString.copyFromUtf8("transaction expired")) + .setMessage(ByteString.copyFromUtf8("Transaction expired")) .build(); } catch (Exception e) { logger.error(BROADCAST_TRANS_FAILED, txID, e.getMessage()); return builder.setResult(false).setCode(response_code.OTHER_ERROR) - .setMessage(ByteString.copyFromUtf8("other error : " + e.getMessage())) + .setMessage(ByteString.copyFromUtf8("Error: " + e.getMessage())) .build(); } } From 5042fe17f115f43e7616cb357e5a726f25d8be66 Mon Sep 17 00:00:00 2001 From: neo hong Date: Mon, 23 Aug 2021 16:22:56 +0800 Subject: [PATCH 136/341] update ALLOW_TVM_COMPATIBLE_EVM and ALLOW_TVM_LONDON proposals --- .../org/tron/core/store/DynamicPropertiesStore.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java index c614953ab86..ac92e768bf7 100644 --- a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java +++ b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java @@ -760,6 +760,18 @@ private DynamicPropertiesStore(@Value("properties") String dbName) { } } + try { + this.getAllowTvmLondon(); + } catch (IllegalArgumentException e) { + this.saveAllowTvmLondon(CommonParameter.getInstance().getAllowTvmLondon()); + } + + try { + this.getAllowTvmCompatibleEvm(); + } catch (IllegalArgumentException e) { + this.saveAllowTvmCompatibleEvm(CommonParameter.getInstance().getAllowTvmCompatibleEvm()); + } + try { this.getAllowAccountAssetOptimization(); } catch (IllegalArgumentException e) { From af26fbfdeeefd1402bbea7ed9d152a300e133428 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Mon, 23 Aug 2021 16:40:13 +0800 Subject: [PATCH 137/341] solve sonar problem --- framework/src/main/java/org/tron/core/config/args/Args.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index 2892172d0af..147ed1655f1 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -611,7 +611,7 @@ public static void setParam(final String[] args, final String confFileName) { ? config.getInt(Constant.NODE_RPC_MIN_EFFECTIVE_CONNECTION) : 1; PARAMETER.trxCacheEnable = config.hasPath(Constant.NODE_RPC_TRX_CACHE_ENABLE) - ? config.getBoolean(Constant.NODE_RPC_TRX_CACHE_ENABLE) : false; + && config.getBoolean(Constant.NODE_RPC_TRX_CACHE_ENABLE); PARAMETER.blockNumForEnergyLimit = config.hasPath(Constant.ENERGY_LIMIT_BLOCK_NUM) ? config.getInt(Constant.ENERGY_LIMIT_BLOCK_NUM) : 4727890L; From 477a27819816af81c6ba76c47bfe800190802c39 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Mon, 23 Aug 2021 17:08:55 +0800 Subject: [PATCH 138/341] feat: get energy price from proposals, parse gasPrice and gas --- .../core/store/DynamicPropertiesStore.java | 42 ++++- .../org/tron/core/store/ProposalStore.java | 15 ++ .../src/main/java/org/tron/core/Wallet.java | 30 ++++ .../tron/core/consensus/ProposalService.java | 4 + .../main/java/org/tron/core/db/Manager.java | 8 + .../core/db/api/EnergyPriceHistoryLoader.java | 61 +++++++ .../org/tron/core/db/api/MoveAbiHelper.java | 1 - .../jsonrpc/FullNodeJsonRpcHttpService.java | 1 + .../core/services/jsonrpc/JsonRpcApiUtil.java | 30 ++++ .../services/jsonrpc/TransactionResult.java | 18 ++- .../services/jsonrpc/TronJsonRpcImpl.java | 40 ++++- .../db/api/EnergyPriceHistoryLoaderTest.java | 153 ++++++++++++++++++ .../org/tron/core/jsonrpc/JsonRpcTest.java | 27 ++++ .../core/services/ProposalServiceTest.java | 19 +++ 14 files changed, 435 insertions(+), 14 deletions(-) create mode 100644 framework/src/main/java/org/tron/core/db/api/EnergyPriceHistoryLoader.java create mode 100644 framework/src/test/java/org/tron/core/db/api/EnergyPriceHistoryLoaderTest.java diff --git a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java index c67e2938987..9ec0513f964 100644 --- a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java +++ b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java @@ -64,6 +64,8 @@ public class DynamicPropertiesStore extends TronStoreWithRevoking private static final byte[] WITNESS_STANDBY_ALLOWANCE = "WITNESS_STANDBY_ALLOWANCE".getBytes(); private static final byte[] ENERGY_FEE = "ENERGY_FEE".getBytes(); + private static final long DEFAULT_ENERGY_FEE = 100L; + public static final String DEFAULT_ENERGY_PRICE_HISTORY = "0:" + DEFAULT_ENERGY_FEE; private static final byte[] MAX_CPU_TIME_OF_ONE_TX = "MAX_CPU_TIME_OF_ONE_TX".getBytes(); //abandon private static final byte[] CREATE_ACCOUNT_FEE = "CREATE_ACCOUNT_FEE".getBytes(); @@ -160,6 +162,8 @@ public class DynamicPropertiesStore extends TronStoreWithRevoking "NEW_REWARD_ALGORITHM_EFFECTIVE_CYCLE".getBytes(); //This value is only allowed to be 1 private static final byte[] ALLOW_ACCOUNT_ASSET_OPTIMIZATION = "ALLOW_ACCOUNT_ASSET_OPTIMIZATION".getBytes(); + private static final byte[] ENERGY_PRICE_HISTORY = "ENERGY_PRICE_HISTORY".getBytes(); + private static final byte[] ENERGY_PRICE_HISTORY_DONE = "ENERGY_PRICE_HISTORY_DONE".getBytes(); @Autowired @@ -383,7 +387,7 @@ private DynamicPropertiesStore(@Value("properties") String dbName) { try { this.getEnergyFee(); } catch (IllegalArgumentException e) { - this.saveEnergyFee(100L);// 100 sun per energy + this.saveEnergyFee(DEFAULT_ENERGY_FEE); // 100 sun per energy } try { @@ -764,6 +768,18 @@ private DynamicPropertiesStore(@Value("properties") String dbName) { this.setAllowAccountAssetOptimization(CommonParameter .getInstance().getAllowAccountAssetOptimization()); } + + try { + this.getEnergyPriceHistoryDone(); + } catch (IllegalArgumentException e) { + this.saveEnergyPriceHistoryDone(0); + } + + try { + this.getEnergyPriceHistory(); + } catch (IllegalArgumentException e) { + this.saveEnergyPriceHistory(DEFAULT_ENERGY_PRICE_HISTORY); + } } public String intArrayToString(int[] a) { @@ -2286,6 +2302,30 @@ public void setAllowAccountAssetOptimization(long value) { this.put(ALLOW_ACCOUNT_ASSET_OPTIMIZATION, new BytesCapsule(ByteArray.fromLong(value))); } + public void saveEnergyPriceHistoryDone(long num) { + this.put(ENERGY_PRICE_HISTORY_DONE, + new BytesCapsule(ByteArray.fromLong(num))); + } + + public long getEnergyPriceHistoryDone() { + return Optional.ofNullable(getUnchecked(ENERGY_PRICE_HISTORY_DONE)) + .map(BytesCapsule::getData) + .map(ByteArray::toLong) + .orElseThrow( + () -> new IllegalArgumentException("not found ENERGY_PRICE_HISTORY_DONE")); + } + + public String getEnergyPriceHistory() { + return Optional.ofNullable(getUnchecked(ENERGY_PRICE_HISTORY)) + .map(BytesCapsule::getData) + .map(ByteArray::toStr) + .orElseThrow(() -> new IllegalArgumentException("not found ENERGY_PRICE_HISTORY")); + } + + public void saveEnergyPriceHistory(String value) { + this.put(ENERGY_PRICE_HISTORY, new BytesCapsule(ByteArray.fromString(value))); + } + private static class DynamicResourceProperties { private static final byte[] ONE_DAY_NET_LIMIT = "ONE_DAY_NET_LIMIT".getBytes(); diff --git a/chainbase/src/main/java/org/tron/core/store/ProposalStore.java b/chainbase/src/main/java/org/tron/core/store/ProposalStore.java index ebdee87b3ac..3d39b717cfc 100644 --- a/chainbase/src/main/java/org/tron/core/store/ProposalStore.java +++ b/chainbase/src/main/java/org/tron/core/store/ProposalStore.java @@ -10,6 +10,7 @@ import org.tron.core.capsule.ProposalCapsule; import org.tron.core.db.TronStoreWithRevoking; import org.tron.core.exception.ItemNotFoundException; +import org.tron.protos.Protocol.Proposal.State; @Component public class ProposalStore extends TronStoreWithRevoking { @@ -36,4 +37,18 @@ public List getAllProposals() { : -1) .collect(Collectors.toList()); } + + /** + * note: return in asc order by expired time + */ + public List getSpecifiedProposals(State state, long code) { + return Streams.stream(iterator()) + .map(Map.Entry::getValue) + .filter(proposalCapsule -> proposalCapsule.getState().equals(state)) + .filter(proposalCapsule -> proposalCapsule.getParameters().containsKey(code)) + .sorted( + (ProposalCapsule a, ProposalCapsule b) -> a.getExpirationTime() > b.getExpirationTime() + ? 1 : -1) + .collect(Collectors.toList()); + } } \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index c735d90be47..eba98d8b74b 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -247,6 +247,9 @@ public class Wallet { private static final byte[] SHIELDED_TRC20_LOG_TOPICS_BURN_TOKEN = Hash.sha3(ByteArray .fromString("TokenBurn(address,uint256,bytes32[3])")); private static final String BROADCAST_TRANS_FAILED = "Broadcast transaction {} failed, {}."; + + private boolean energyPriceHistoryLoaded = false; + @Getter private final SignInterface cryptoEngine; @Autowired @@ -3828,5 +3831,32 @@ public void checkAccountIdentifier(BalanceContract.AccountIdentifier accountIden public long getEnergyFee() { return chainBaseManager.getDynamicPropertiesStore().getEnergyFee(); } + + // this function should be called after EnergyPriceHistoryLoader done + public long getEnergyFee(long timestamp) { + try { + String energyPriceHistory = + chainBaseManager.getDynamicPropertiesStore().getEnergyPriceHistory(); + return getEnergyFee(timestamp, energyPriceHistory); + } catch (Exception e) { + logger.error("getEnergyFee timestamp={} failed, error is {}", timestamp, e.getMessage()); + return getEnergyFee(); + } + } + + public long getEnergyFee(long timestamp, String energyPriceHistory) { + String[] priceList = energyPriceHistory.split(","); + + for (int i = priceList.length - 1; i >= 0; i--) { + String[] priceArray = priceList[i].split(":"); + long time = Long.parseLong(priceArray[0]); + long price = Long.parseLong(priceArray[1]); + if (timestamp > time) { + return price; + } + } + + return getEnergyFee(); + } } diff --git a/framework/src/main/java/org/tron/core/consensus/ProposalService.java b/framework/src/main/java/org/tron/core/consensus/ProposalService.java index 4f40473a3c0..765c309df9a 100644 --- a/framework/src/main/java/org/tron/core/consensus/ProposalService.java +++ b/framework/src/main/java/org/tron/core/consensus/ProposalService.java @@ -75,6 +75,10 @@ public static boolean process(Manager manager, ProposalCapsule proposalCapsule) } case ENERGY_FEE: { manager.getDynamicPropertiesStore().saveEnergyFee(entry.getValue()); + // update energy price history + manager.getDynamicPropertiesStore().saveEnergyPriceHistory( + manager.getDynamicPropertiesStore().getEnergyPriceHistory() + + "," + proposalCapsule.getExpirationTime() + ":" + entry.getValue()); break; } case EXCHANGE_CREATE_FEE: { diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 41397818a63..2b5e9ff4105 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -90,6 +90,7 @@ import org.tron.core.db.accountstate.TrieService; import org.tron.core.db.accountstate.callback.AccountStateCallBack; import org.tron.core.db.api.AssetUpdateHelper; +import org.tron.core.db.api.EnergyPriceHistoryLoader; import org.tron.core.db.api.MoveAbiHelper; import org.tron.core.db2.ISession; import org.tron.core.db2.core.Chainbase; @@ -275,6 +276,10 @@ public boolean needToMoveAbi() { return getDynamicPropertiesStore().getAbiMoveDone() == 0L; } + public boolean needToLoadEnergyPriceHistory() { + return getDynamicPropertiesStore().getEnergyPriceHistoryDone() == 0L; + } + public DynamicPropertiesStore getDynamicPropertiesStore() { return chainBaseManager.getDynamicPropertiesStore(); } @@ -409,6 +414,9 @@ public void init() { new MoveAbiHelper(chainBaseManager).doWork(); } + if (needToLoadEnergyPriceHistory()) { + new EnergyPriceHistoryLoader(chainBaseManager).doWork(); + } //for test only chainBaseManager.getDynamicPropertiesStore().updateDynamicStoreByConfig(); diff --git a/framework/src/main/java/org/tron/core/db/api/EnergyPriceHistoryLoader.java b/framework/src/main/java/org/tron/core/db/api/EnergyPriceHistoryLoader.java new file mode 100644 index 00000000000..44f947a8526 --- /dev/null +++ b/framework/src/main/java/org/tron/core/db/api/EnergyPriceHistoryLoader.java @@ -0,0 +1,61 @@ +package org.tron.core.db.api; + +import java.util.ArrayList; +import java.util.List; + +import lombok.extern.slf4j.Slf4j; +import org.tron.core.ChainBaseManager; +import org.tron.core.capsule.ProposalCapsule; +import org.tron.core.store.DynamicPropertiesStore; +import org.tron.core.utils.ProposalUtil.ProposalType; +import org.tron.protos.Protocol.Proposal.State; + +@Slf4j(topic = "DB") +public class EnergyPriceHistoryLoader { + + private final ChainBaseManager chainBaseManager; + public List proposalCapsuleList = new ArrayList<>(); + + public EnergyPriceHistoryLoader(ChainBaseManager chainBaseManager) { + this.chainBaseManager = chainBaseManager; + } + + public void doWork() { + long start = System.currentTimeMillis(); + logger.info("Start to load energy price"); + + getEnergyProposals(); + if (!proposalCapsuleList.isEmpty()) { + String energyPriceHistory = parseProposalsToStr(); + chainBaseManager.getDynamicPropertiesStore().saveEnergyPriceHistory(energyPriceHistory); + } + // finish(); + + logger.info( + "Complete the energy price load, total time: {} milliseconds, total count: {}", + System.currentTimeMillis() - start, proposalCapsuleList.size()); + } + + public void getEnergyProposals() { + proposalCapsuleList = chainBaseManager.getProposalStore() + .getSpecifiedProposals(State.APPROVED, ProposalType.ENERGY_FEE.getCode()); + } + + public String parseProposalsToStr() { + StringBuilder builder = new StringBuilder(DynamicPropertiesStore.DEFAULT_ENERGY_PRICE_HISTORY); + + for (ProposalCapsule proposalCapsule : proposalCapsuleList) { + builder.append(",") + .append(proposalCapsule.getExpirationTime()) + .append(":") + .append(proposalCapsule.getParameters().get(ProposalType.ENERGY_FEE.getCode())); + } + + return builder.toString(); + } + + public void finish() { + chainBaseManager.getDynamicPropertiesStore().saveEnergyPriceHistoryDone(1); + } + +} diff --git a/framework/src/main/java/org/tron/core/db/api/MoveAbiHelper.java b/framework/src/main/java/org/tron/core/db/api/MoveAbiHelper.java index dad48d117b3..830114b9e40 100644 --- a/framework/src/main/java/org/tron/core/db/api/MoveAbiHelper.java +++ b/framework/src/main/java/org/tron/core/db/api/MoveAbiHelper.java @@ -5,7 +5,6 @@ import lombok.extern.slf4j.Slf4j; import org.tron.core.ChainBaseManager; -import org.tron.core.capsule.AbiCapsule; import org.tron.core.capsule.ContractCapsule; import org.tron.core.store.AbiStore; import org.tron.core.store.ContractStore; diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java b/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java index e5b65cecbf6..b333397542c 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/FullNodeJsonRpcHttpService.java @@ -29,6 +29,7 @@ public class FullNodeJsonRpcHttpService implements Service { @Override public void init() { + } @Override diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index 8bbdbee15e5..49f8e1e60fd 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -13,6 +13,7 @@ import org.bouncycastle.util.encoders.Hex; import org.tron.api.GrpcAPI.AssetIssueList; import org.tron.common.crypto.Hash; +import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.ByteArray; import org.tron.common.utils.ByteUtil; import org.tron.common.utils.Commons; @@ -492,4 +493,33 @@ public static long parseQuantityValue(String value) throws JsonRpcInvalidParamsE return callValue; } + + public static long getEnergyUsageTotal(Transaction transaction, Wallet wallet) { + long energyUsageTotal = 0; + + String txID = ByteArray.toHexString(Sha256Hash + .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray())); + TransactionInfo transactionInfo = wallet + .getTransactionInfoById(ByteString.copyFrom(txID.getBytes())); + if (transactionInfo != null) { + energyUsageTotal = transactionInfo.getReceipt().getEnergyUsageTotal(); + } + + return energyUsageTotal; + } + + public static long getEnergyUsageTotal(List transactionInfoList, int i, + long blockNum) { + long energyUsageTotal = 0; + try { + energyUsageTotal = transactionInfoList.get(i).getReceipt().getEnergyUsageTotal(); + } catch (Exception e) { + logger.warn( + "getBlockResult cannot get energy from transactionInfo, block.num={}, error is {}", + blockNum, e.getMessage()); + } + + return energyUsageTotal; + } } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java index 3b8cd7cb307..a9ea753a79b 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java @@ -31,9 +31,8 @@ public class TransactionResult { public String r; public String s; - public TransactionResult(Protocol.Block b, int index, Protocol.Transaction tx, Wallet wallet) { - BlockCapsule blockCapsule = new BlockCapsule(b); - + public TransactionResult(BlockCapsule blockCapsule, int index, Protocol.Transaction tx, + long energyUsageTotal, long energyFee, Wallet wallet) { byte[] txid = new TransactionCapsule(tx).getTransactionId().getBytes(); hash = ByteArray.toJsonHex(txid); nonce = null; // no value @@ -54,8 +53,8 @@ public TransactionResult(Protocol.Block b, int index, Protocol.Transaction tx, W value = null; } - gas = null; // no value - gasPrice = null; // no value + gas = ByteArray.toJsonHex(energyUsageTotal); + gasPrice = ByteArray.toJsonHex(energyFee); input = null; // no value ByteString signature = tx.getSignature(0); // r[32] + s[32] + v[1] @@ -68,6 +67,15 @@ public TransactionResult(Protocol.Block b, int index, Protocol.Transaction tx, W s = ByteArray.toJsonHex(sByte); } + // gasPrice from blockCapsule + public TransactionResult(BlockCapsule blockCapsule, int index, Protocol.Transaction tx, + long energyUsageTotal, Wallet wallet) { + this(blockCapsule, index, tx, energyUsageTotal, 0, wallet); + + gas = ByteArray.toJsonHex(energyUsageTotal); + gasPrice = ByteArray.toJsonHex(wallet.getEnergyFee(blockCapsule.getTimeStamp())); + } + @Override public String toString() { return "TransactionResult{" diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 729363d688e..65bf01497db 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -5,6 +5,7 @@ import static org.tron.core.services.http.Util.setTransactionExtraData; import static org.tron.core.services.http.Util.setTransactionPermissionId; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.addressHashToByteArray; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getEnergyUsageTotal; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTxID; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.triggerCallContract; @@ -24,9 +25,11 @@ import org.tron.api.GrpcAPI.Return.response_code; import org.tron.api.GrpcAPI.TransactionExtention; import org.tron.common.crypto.Hash; +import org.tron.common.parameter.CommonParameter; import org.tron.common.runtime.vm.DataWord; import org.tron.common.utils.ByteArray; import org.tron.common.utils.ByteUtil; +import org.tron.common.utils.Sha256Hash; import org.tron.core.Wallet; import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.TransactionCapsule; @@ -181,21 +184,38 @@ private BlockResult getBlockResult(Block block, boolean fullTx) { br.extraData = null; // no value br.size = ByteArray.toJsonHex(block.getSerializedSize()); br.gasLimit = null; - br.gasUsed = null; br.timestamp = ByteArray.toJsonHex(blockCapsule.getTimeStamp()); + long gasUsedInBlock = 0; List txes = new ArrayList<>(); + List transactionsList = block.getTransactionsList(); + List transactionInfoList = + wallet.getTransactionInfoByBlockNum(blockCapsule.getNum()).getTransactionInfoList(); if (fullTx) { - for (int i = 0; i < block.getTransactionsList().size(); i++) { - txes.add(new TransactionResult(block, i, block.getTransactionsList().get(i), wallet)); + long energyFee = wallet.getEnergyFee(blockCapsule.getTimeStamp()); + + for (int i = 0; i < transactionsList.size(); i++) { + Transaction transaction = transactionsList.get(i); + + long energyUsageTotal = getEnergyUsageTotal(transactionInfoList, i, blockCapsule.getNum()); + gasUsedInBlock += energyUsageTotal; + + txes.add(new TransactionResult(blockCapsule, i, transaction, + energyUsageTotal, energyFee, wallet)); } } else { - for (Transaction tx : block.getTransactionsList()) { - txes.add(ByteArray.toJsonHex(new TransactionCapsule(tx).getTransactionId().getBytes())); + for (int i = 0; i < transactionsList.size(); i++) { + gasUsedInBlock += getEnergyUsageTotal(transactionInfoList, i, blockCapsule.getNum()); + + String txID = ByteArray.toHexString(Sha256Hash + .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), + transactionsList.get(i).getRawData().toByteArray())); + txes.add(ByteArray.toJsonHex(txID.getBytes())); } } br.transactions = txes.toArray(); + br.gasUsed = ByteArray.toJsonHex(gasUsedInBlock); List ul = new ArrayList<>(); br.uncles = ul.toArray(new String[ul.size()]); @@ -500,7 +520,9 @@ private TransactionResult formatRpcTransaction(TransactionInfo transactioninfo, return null; } - return new TransactionResult(block, transactionIndex, transaction, wallet); + long energyUsageTotal = transactioninfo.getReceipt().getEnergyUsageTotal(); + return new TransactionResult(new BlockCapsule(block), transactionIndex, transaction, + energyUsageTotal, wallet); } public TransactionResult getTransactionByBlockAndIndex(Block block, String index) @@ -515,8 +537,12 @@ public TransactionResult getTransactionByBlockAndIndex(Block block, String index if (txIndex >= block.getTransactionsCount()) { return null; } + Transaction transaction = block.getTransactions(txIndex); - return new TransactionResult(block, txIndex, transaction, wallet); + long energyUsageTotal = getEnergyUsageTotal(transaction, wallet); + + return new TransactionResult(new BlockCapsule(block), txIndex, transaction, energyUsageTotal, + wallet); } @Override diff --git a/framework/src/test/java/org/tron/core/db/api/EnergyPriceHistoryLoaderTest.java b/framework/src/test/java/org/tron/core/db/api/EnergyPriceHistoryLoaderTest.java new file mode 100644 index 00000000000..a96de1d2e04 --- /dev/null +++ b/framework/src/test/java/org/tron/core/db/api/EnergyPriceHistoryLoaderTest.java @@ -0,0 +1,153 @@ +package org.tron.core.db.api; + +import static org.tron.core.utils.ProposalUtil.ProposalType.ALLOW_CREATION_OF_CONTRACTS; +import static org.tron.core.utils.ProposalUtil.ProposalType.ASSET_ISSUE_FEE; +import static org.tron.core.utils.ProposalUtil.ProposalType.ENERGY_FEE; +import static org.tron.core.utils.ProposalUtil.ProposalType.MAX_FEE_LIMIT; +import static org.tron.core.utils.ProposalUtil.ProposalType.TRANSACTION_FEE; +import static org.tron.core.utils.ProposalUtil.ProposalType.WITNESS_127_PAY_PER_BLOCK; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; +import lombok.extern.slf4j.Slf4j; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.testng.annotations.Test; +import org.tron.common.application.TronApplicationContext; +import org.tron.common.utils.FileUtil; +import org.tron.core.ChainBaseManager; +import org.tron.core.Constant; +import org.tron.core.capsule.ProposalCapsule; +import org.tron.core.config.DefaultConfig; +import org.tron.core.config.args.Args; +import org.tron.protos.Protocol.Proposal; +import org.tron.protos.Protocol.Proposal.State; + +@Slf4j +public class EnergyPriceHistoryLoaderTest { + + private static ChainBaseManager chainBaseManager; + private static TronApplicationContext context; + private static String dbPath = "output_EnergyPriceHistoryLoaderTest_test"; + private static long t1 = 1542607200000L; + private static long price1 = 20; + private static long t3 = 1544724000000L; + private static long price3 = 10; + private static long t4 = 1606240800000L; + private static long price4 = 40; + private static long t5 = 1613044800000L; + private static long price5 = 140L; + + static { + Args.setParam(new String[] {"--output-directory", dbPath}, Constant.TEST_CONF); + context = new TronApplicationContext(DefaultConfig.class); + } + + @BeforeClass + public static void init() { + chainBaseManager = context.getBean(ChainBaseManager.class); + } + + @AfterClass + public static void removeDB() { + Args.clearParam(); + context.destroy(); + if (FileUtil.deleteDir(new File(dbPath))) { + logger.info("Release resources successful."); + } else { + logger.info("Release resources failure."); + } + } + + public void initDB() { + t1 = 1542607200000L; + price1 = 20; + initProposal(ENERGY_FEE.getCode(), t1, price1, State.APPROVED); + + long t2 = 1543168800000L; + long price2 = 11; + initProposal(ENERGY_FEE.getCode(), t2, price2, State.DISAPPROVED); + + t3 = 1544724000000L; + price3 = 10; + initProposal(ENERGY_FEE.getCode(), t3, price3, State.APPROVED); + + t4 = 1606240800000L; + price4 = 40; + initProposal(ENERGY_FEE.getCode(), t4, price4, State.APPROVED); + + t5 = 1613044800000L; + price5 = 140L; + Map parameters = new HashMap<>(); + parameters.put(TRANSACTION_FEE.getCode(), 140L); + parameters.put(ENERGY_FEE.getCode(), price5); + parameters.put(MAX_FEE_LIMIT.getCode(), 5000000000L); + initProposal(parameters, t5, State.APPROVED); + + long t6 = 1629700950000L; + long price6 = 420; + initProposal(ENERGY_FEE.getCode(), t6, price6, State.DISAPPROVED); + + initProposal(ALLOW_CREATION_OF_CONTRACTS.getCode(), 1539259200000L, 1, State.APPROVED); + + parameters = new HashMap<>(); + parameters.put(ASSET_ISSUE_FEE.getCode(), 48000000L); + parameters.put(WITNESS_127_PAY_PER_BLOCK.getCode(), 128000000L); + initProposal(parameters, 1572609600000L, State.CANCELED); + } + + private static void initProposal(long code, long timestamp, long price, State state) { + long id = chainBaseManager.getDynamicPropertiesStore().getLatestProposalNum() + 1; + + Proposal proposal = Proposal.newBuilder().putParameters(code, price) + .setExpirationTime(timestamp) + .setState(state) + .setProposalId(id) + .build(); + ProposalCapsule proposalCapsule = new ProposalCapsule(proposal); + + chainBaseManager.getProposalStore().put(proposalCapsule.createDbKey(), proposalCapsule); + chainBaseManager.getDynamicPropertiesStore().saveLatestProposalNum(id); + } + + private static void initProposal(Map parameters, long timestamp, State state) { + long id = chainBaseManager.getDynamicPropertiesStore().getLatestProposalNum() + 1; + + Proposal proposal = Proposal.newBuilder().putAllParameters(parameters) + .setExpirationTime(timestamp) + .setState(state) + .setProposalId(id) + .build(); + ProposalCapsule proposalCapsule = new ProposalCapsule(proposal); + + chainBaseManager.getProposalStore().put(proposalCapsule.createDbKey(), proposalCapsule); + chainBaseManager.getDynamicPropertiesStore().saveLatestProposalNum(id); + } + + @Test + public void testLoader() { + + if (chainBaseManager == null) { + init(); + } + EnergyPriceHistoryLoader loader = new EnergyPriceHistoryLoader(chainBaseManager); + + initDB(); + + String preEnergyPriceHistory = + chainBaseManager.getDynamicPropertiesStore().getEnergyPriceHistory(); + String expectedRes = preEnergyPriceHistory + "," + t1 + ":" + price1 + + "," + t3 + ":" + price3 + + "," + t4 + ":" + price4 + + "," + t5 + ":" + price5; + + loader.getEnergyProposals(); + String historyStr = loader.parseProposalsToStr(); + + removeDB(); + + Assert.assertEquals(expectedRes, historyStr); + } +} diff --git a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java index 8ea3a3bf17d..7e3fac3bbad 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java @@ -3,6 +3,7 @@ import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getMethodSign; import org.bouncycastle.util.encoders.Hex; +import org.junit.Assert; import org.junit.Test; import org.tron.common.crypto.Hash; import org.tron.common.runtime.vm.DataWord; @@ -79,4 +80,30 @@ private String generateStorageParameter() { return sb.toString(); } + private long parsePrice(long timestamp, String energyPriceHistory) { + String[] priceList = energyPriceHistory.split(","); + + for (int i = priceList.length - 1; i >= 0; i--) { + String[] priceArray = priceList[i].split(":"); + long time = Long.parseLong(priceArray[0]); + long price = Long.parseLong(priceArray[1]); + if (timestamp > time) { + return price; + } + } + + return 0; + } + + @Test + public void testGetEnergyPrice() { + String energyPriceHistory = + "0:100,1542607200000:20,1544724000000:10,1606240800000:40,1613044800000:140"; + Assert.assertEquals(100L, parsePrice(1542607100000L, energyPriceHistory)); + Assert.assertEquals(20L, parsePrice(1542607210000L, energyPriceHistory)); + Assert.assertEquals(10L, parsePrice(1544724100000L, energyPriceHistory)); + Assert.assertEquals(40L, parsePrice(1606240810000L, energyPriceHistory)); + Assert.assertEquals(140L, parsePrice(1613044810000L, energyPriceHistory)); + } + } diff --git a/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java b/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java index f788c31cfca..4e5d420535c 100644 --- a/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java +++ b/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java @@ -1,5 +1,6 @@ package org.tron.core.services; +import static org.tron.core.utils.ProposalUtil.ProposalType.ENERGY_FEE; import static org.tron.core.utils.ProposalUtil.ProposalType.WITNESS_127_PAY_PER_BLOCK; import java.io.File; @@ -63,6 +64,24 @@ public void test() { } } + @Test + public void testUpdateEnergyFee() { + String preHistory = manager.getDynamicPropertiesStore().getEnergyPriceHistory(); + + long newPrice = 500; + Proposal proposal = Proposal.newBuilder().putParameters(ENERGY_FEE.getCode(), newPrice).build(); + ProposalCapsule proposalCapsule = new ProposalCapsule(proposal); + boolean result = ProposalService.process(manager, proposalCapsule); + Assert.assertTrue(result); + + long currentPrice = manager.getDynamicPropertiesStore().getEnergyFee(); + Assert.assertEquals(currentPrice, newPrice); + + String currentHistory = manager.getDynamicPropertiesStore().getEnergyPriceHistory(); + Assert.assertEquals(preHistory + "," + proposalCapsule.getExpirationTime() + ":" + newPrice, + currentHistory); + } + @After public void removeDb() { From 338f9289985272aa417c071431f20a9f4c01956e Mon Sep 17 00:00:00 2001 From: wubin01 Date: Mon, 23 Aug 2021 17:32:18 +0800 Subject: [PATCH 139/341] optimize the peer status check logic --- .../main/java/org/tron/common/overlay/server/Channel.java | 7 +++++++ .../src/main/java/org/tron/core/net/TronNetDelegate.java | 5 +++++ .../main/java/org/tron/core/net/peer/PeerStatusCheck.java | 7 +++++++ 3 files changed, 19 insertions(+) diff --git a/framework/src/main/java/org/tron/common/overlay/server/Channel.java b/framework/src/main/java/org/tron/common/overlay/server/Channel.java index cc8b638f983..0d3358c3b61 100644 --- a/framework/src/main/java/org/tron/common/overlay/server/Channel.java +++ b/framework/src/main/java/org/tron/common/overlay/server/Channel.java @@ -10,6 +10,8 @@ import java.net.InetSocketAddress; import java.net.SocketAddress; import java.util.concurrent.TimeUnit; + +import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; @@ -62,6 +64,9 @@ public class Channel { private volatile boolean isDisconnect; + @Getter + private volatile long disconnectTime; + private boolean isTrustPeer; private boolean isFastForwardPeer; @@ -124,6 +129,7 @@ public void initNode(byte[] nodeId, int remotePort) { public void disconnect(ReasonCode reason) { this.isDisconnect = true; + this.disconnectTime = System.currentTimeMillis(); channelManager.processDisconnect(this, reason); DisconnectMessage msg = new DisconnectMessage(reason); logger.info("Send to {} online-time {}s, {}", @@ -154,6 +160,7 @@ public void processException(Throwable throwable) { public void close() { this.isDisconnect = true; + this.disconnectTime = System.currentTimeMillis(); p2pHandler.close(); msgQueue.close(); ctx.close(); diff --git a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java index f19b9df9ebf..b8e29908842 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java +++ b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java @@ -13,6 +13,7 @@ import org.springframework.stereotype.Component; import org.tron.common.backup.BackupServer; import org.tron.common.overlay.message.Message; +import org.tron.common.overlay.server.Channel; import org.tron.common.overlay.server.ChannelManager; import org.tron.common.overlay.server.SyncPool; import org.tron.common.utils.Sha256Hash; @@ -101,6 +102,10 @@ public void trustNode(PeerConnection peer) { channelManager.getTrustNodes().put(peer.getInetAddress(), peer.getNode()); } + public void notifyDisconnect(Channel channel){ + channelManager.notifyDisconnect(channel); + } + public Collection getActivePeer() { return syncPool.getActivePeers(); } diff --git a/framework/src/main/java/org/tron/core/net/peer/PeerStatusCheck.java b/framework/src/main/java/org/tron/core/net/peer/PeerStatusCheck.java index 6600238fcc5..77c3595cf43 100644 --- a/framework/src/main/java/org/tron/core/net/peer/PeerStatusCheck.java +++ b/framework/src/main/java/org/tron/core/net/peer/PeerStatusCheck.java @@ -22,6 +22,8 @@ public class PeerStatusCheck { private int blockUpdateTimeout = 30_000; + private int disconnectTimeout = 10_000; + public void init() { peerStatusCheckExecutor.scheduleWithFixedDelay(() -> { try { @@ -42,6 +44,11 @@ public void statusCheck() { tronNetDelegate.getActivePeer().forEach(peer -> { + long disconnectTime = peer.getDisconnectTime(); + if (disconnectTime != 0 && now - disconnectTime > disconnectTimeout) { + tronNetDelegate.notifyDisconnect(peer); + } + boolean isDisconnected = false; if (peer.isNeedSyncFromPeer() From 972e408b931145acb76b03cf8aa2674c7e9eaff2 Mon Sep 17 00:00:00 2001 From: Asuka Date: Mon, 23 Aug 2021 17:54:44 +0800 Subject: [PATCH 140/341] bugfix: keep decreasing complexity --- .../tron/common/runtime/vm/BatchValidateSignContractTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java index 553eaf2908b..05ca25cf294 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java @@ -6,6 +6,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.tuple.Pair; import org.bouncycastle.util.encoders.Hex; +import org.junit.Ignore; import org.junit.Test; import org.testng.Assert; import org.tron.common.crypto.ECKey; @@ -25,7 +26,7 @@ public class BatchValidateSignContractTest { static { smellData = new byte[10]; - longData = new byte[1000000]; + longData = new byte[1000]; Arrays.fill(smellData, (byte) 1); Arrays.fill(longData, (byte) 2); } @@ -85,6 +86,7 @@ public void staticCallTest() { System.gc(); // force triggering full gc to avoid timeout for next test } + @Ignore @Test public void correctionTest() { contract.setConstantCall(false); From d0e5892a868ecdfb7f42d94fc27c0ec373358a5e Mon Sep 17 00:00:00 2001 From: Asuka Date: Mon, 23 Aug 2021 18:58:11 +0800 Subject: [PATCH 141/341] bugfix: revert removing correction test --- .../vm/BatchValidateSignContractTest.java | 35 +++---------------- 1 file changed, 4 insertions(+), 31 deletions(-) diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java index 05ca25cf294..f7226bb3b3d 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BatchValidateSignContractTest.java @@ -66,27 +66,17 @@ public void staticCallTest() { Assert.assertEquals(ret.getValue()[i], 1); } } - signatures = new ArrayList<>(); - addresses = new ArrayList<>(); //test when length >= 16 - for (int i = 0; i < 17; i++) { - ECKey key = new ECKey(); - byte[] sign = key.sign(hash).toByteArray(); - if (i == 11) { - signatures.add(Hex.toHexString(DataWord.ONE().getData())); - } else { - signatures.add(Hex.toHexString(sign)); - } - addresses.add(StringUtil.encode58Check(key.getAddress())); - } + signatures.add(Hex.toHexString(DataWord.ONE().getData())); + addresses + .add(StringUtil.encode58Check(TransactionTrace.convertToTronAddress(new byte[20]))); ret = validateMultiSign(hash, signatures, addresses); Assert.assertEquals(ret.getValue().length, 32); Assert.assertEquals(ret.getValue(), new byte[32]); System.gc(); // force triggering full gc to avoid timeout for next test } - - @Ignore + @Test public void correctionTest() { contract.setConstantCall(false); @@ -130,23 +120,6 @@ public void correctionTest() { incorrectSigns.remove(incorrectSigns.size() - 1); ret = validateMultiSign(hash, incorrectSigns, addresses); Assert.assertEquals(ret.getValue(), DataWord.ZERO().getData()); - - //test when length >= 32 - signatures = new ArrayList<>(); - addresses = new ArrayList<>(); - for (int i = 0; i < 33; i++) { - ECKey key = new ECKey(); - byte[] sign = key.sign(hash).toByteArray(); - if (i == 13) { - signatures.add(Hex.toHexString(DataWord.ONE().getData())); - } else { - signatures.add(Hex.toHexString(sign)); - } - addresses.add(StringUtil.encode58Check(key.getAddress())); - } - ret = validateMultiSign(hash, signatures, addresses); - Assert.assertEquals(ret.getValue().length, 32); - Assert.assertEquals(ret.getValue(), new byte[32]); System.gc(); // force triggering full gc to avoid timeout for next test } From d285349897f4e8020c9decec3408ee5d2694f638 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Mon, 23 Aug 2021 19:13:36 +0800 Subject: [PATCH 142/341] feat: format transaction to transactionResult if no transactioninfo; set input as rawdata.data --- .../java/org/tron/common/utils/ByteArray.java | 2 +- .../core/db/api/EnergyPriceHistoryLoader.java | 6 +-- .../services/jsonrpc/TransactionResult.java | 37 ++++++++++++++++++- .../services/jsonrpc/TronJsonRpcImpl.java | 16 +++++--- .../org/tron/core/jsonrpc/JsonRpcTest.java | 6 +-- 5 files changed, 53 insertions(+), 14 deletions(-) diff --git a/common/src/main/java/org/tron/common/utils/ByteArray.java b/common/src/main/java/org/tron/common/utils/ByteArray.java index c74020d8fed..801c64bd68a 100644 --- a/common/src/main/java/org/tron/common/utils/ByteArray.java +++ b/common/src/main/java/org/tron/common/utils/ByteArray.java @@ -113,7 +113,7 @@ public static byte[] fromObject(Object obj) { * null for empty [] */ public static String toJsonHex(byte[] x) { - return x == null || x.length == 0 ? null : "0x" + Hex.toHexString(x); + return x == null || x.length == 0 ? "0x" : "0x" + Hex.toHexString(x); } // ignore the 41 diff --git a/framework/src/main/java/org/tron/core/db/api/EnergyPriceHistoryLoader.java b/framework/src/main/java/org/tron/core/db/api/EnergyPriceHistoryLoader.java index 44f947a8526..05b5edef8b0 100644 --- a/framework/src/main/java/org/tron/core/db/api/EnergyPriceHistoryLoader.java +++ b/framework/src/main/java/org/tron/core/db/api/EnergyPriceHistoryLoader.java @@ -14,7 +14,7 @@ public class EnergyPriceHistoryLoader { private final ChainBaseManager chainBaseManager; - public List proposalCapsuleList = new ArrayList<>(); + private List proposalCapsuleList = new ArrayList<>(); public EnergyPriceHistoryLoader(ChainBaseManager chainBaseManager) { this.chainBaseManager = chainBaseManager; @@ -29,10 +29,10 @@ public void doWork() { String energyPriceHistory = parseProposalsToStr(); chainBaseManager.getDynamicPropertiesStore().saveEnergyPriceHistory(energyPriceHistory); } - // finish(); + finish(); logger.info( - "Complete the energy price load, total time: {} milliseconds, total count: {}", + "Complete energy price load, total time: {} milliseconds, total proposal count: {}", System.currentTimeMillis() - start, proposalCapsuleList.size()); } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java index a9ea753a79b..27c4f389d50 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java @@ -55,7 +55,7 @@ public TransactionResult(BlockCapsule blockCapsule, int index, Protocol.Transact gas = ByteArray.toJsonHex(energyUsageTotal); gasPrice = ByteArray.toJsonHex(energyFee); - input = null; // no value + input = ByteArray.toJsonHex(tx.getRawData().getData().toByteArray()); ByteString signature = tx.getSignature(0); // r[32] + s[32] + v[1] byte[] signData = signature.toByteArray(); @@ -76,6 +76,41 @@ public TransactionResult(BlockCapsule blockCapsule, int index, Protocol.Transact gasPrice = ByteArray.toJsonHex(wallet.getEnergyFee(blockCapsule.getTimeStamp())); } + public TransactionResult(Protocol.Transaction tx, Wallet wallet) { + byte[] txid = new TransactionCapsule(tx).getTransactionId().getBytes(); + hash = ByteArray.toJsonHex(txid); + nonce = null; // no value + blockHash = "0x"; + blockNumber = "0x"; + transactionIndex = "0x"; + + if (!tx.getRawData().getContractList().isEmpty()) { + Contract contract = tx.getRawData().getContract(0); + byte[] fromByte = TransactionCapsule.getOwner(contract); + byte[] toByte = getToAddress(tx); + from = ByteArray.toJsonHexAddress(fromByte); + to = ByteArray.toJsonHexAddress(toByte); + value = ByteArray.toJsonHex(getTransactionAmount(contract, hash, wallet)); + } else { + from = null; + to = null; + value = null; + } + + gas = "0x0"; + gasPrice = "0x"; + input = ByteArray.toJsonHex(tx.getRawData().getData().toByteArray()); + + ByteString signature = tx.getSignature(0); // r[32] + s[32] + v[1] + byte[] signData = signature.toByteArray(); + byte vByte = (byte) (signData[64] + 27); // according to Base64toBytes + byte[] rByte = Arrays.copyOfRange(signData, 0, 32); + byte[] sByte = Arrays.copyOfRange(signData, 32, 64); + v = ByteArray.toJsonHex(vByte); + r = ByteArray.toJsonHex(rByte); + s = ByteArray.toJsonHex(sByte); + } + @Override public String toString() { return "TransactionResult{" diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 65bf01497db..15eb0f2ac2f 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -487,10 +487,16 @@ public CompilationResult ethSubmitHashrate(String hashrate, String id) { @Override public TransactionResult getTransactionByHash(String txid) throws JsonRpcInvalidParamsException { - TransactionInfo transactionInfo = wallet - .getTransactionInfoById(ByteString.copyFrom(hashToByteArray(txid))); + ByteString transactionId = ByteString.copyFrom(hashToByteArray(txid)); + + TransactionInfo transactionInfo = wallet.getTransactionInfoById(transactionId); if (transactionInfo == null) { - return null; + Transaction transaction = wallet.getTransactionById(transactionId); + if (transaction == null) { + return null; + } + + return new TransactionResult(transaction, wallet); } Block block = wallet.getBlockByNum(transactionInfo.getBlockNumber()); @@ -498,10 +504,10 @@ public TransactionResult getTransactionByHash(String txid) throws JsonRpcInvalid return null; } - return formatRpcTransaction(transactionInfo, block); + return formatTransactionResult(transactionInfo, block); } - private TransactionResult formatRpcTransaction(TransactionInfo transactioninfo, Block block) { + private TransactionResult formatTransactionResult(TransactionInfo transactioninfo, Block block) { String txid = ByteArray.toHexString(transactioninfo.getId().toByteArray()); Transaction transaction = null; diff --git a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java index 7e3fac3bbad..a33d20bfdbd 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java @@ -14,8 +14,7 @@ public class JsonRpcTest { - @Test - public void generateCallParameter1() { + public void generateCallParameterWIthMethodAndParam() { String ownerAddress = "TXvRyjomvtNWSKvNouTvAedRGD4w9RXLZD"; String usdjAddress = "TLBaRhANQoJFTqre9Nf1mjuwNWjCJeYqUL"; // nile udsj address @@ -37,8 +36,7 @@ public void generateCallParameter1() { System.out.println(sb.toString()); } - @Test - public void generateCallParameter2() { + public void generateCallParameterWithMethod() { String ownerAddress = "TRXPT6Ny7EFvTPv7mFUqaFUST39WUZ4zzz"; String usdjAddress = "TXYZopYRdj2D9XRtbG411XZZ3kM5VkAeBf"; // nile udsj address From 2294f72a4a44d2dfa26ebe6465c8eb68db6ba3ed Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Mon, 23 Aug 2021 21:58:13 +0800 Subject: [PATCH 143/341] feat: check transactionInfoList if empty when get energy usage total --- .../core/services/jsonrpc/JsonRpcApiUtil.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index 49f8e1e60fd..a88c861263b 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -512,12 +512,15 @@ public static long getEnergyUsageTotal(Transaction transaction, Wallet wallet) { public static long getEnergyUsageTotal(List transactionInfoList, int i, long blockNum) { long energyUsageTotal = 0; - try { - energyUsageTotal = transactionInfoList.get(i).getReceipt().getEnergyUsageTotal(); - } catch (Exception e) { - logger.warn( - "getBlockResult cannot get energy from transactionInfo, block.num={}, error is {}", - blockNum, e.getMessage()); + + if (!transactionInfoList.isEmpty()) { + try { + energyUsageTotal = transactionInfoList.get(i).getReceipt().getEnergyUsageTotal(); + } catch (Exception e) { + logger.warn( + "getBlockResult cannot get energy from transactionInfo, block.num={}, error is {}", + blockNum, e.getMessage()); + } } return energyUsageTotal; From 8fa5120bfc7fd57807f26c61d3435379d3da9d09 Mon Sep 17 00:00:00 2001 From: neo hong Date: Tue, 24 Aug 2021 11:12:21 +0800 Subject: [PATCH 144/341] add ALLOW_TVM_COMPATIBLE_EVM and ALLOW_TVM_LONDON proposals --- protocol/src/main/protos/core/contract/smart_contract.proto | 1 + 1 file changed, 1 insertion(+) diff --git a/protocol/src/main/protos/core/contract/smart_contract.proto b/protocol/src/main/protos/core/contract/smart_contract.proto index 9a173656481..ffbf399c38e 100644 --- a/protocol/src/main/protos/core/contract/smart_contract.proto +++ b/protocol/src/main/protos/core/contract/smart_contract.proto @@ -55,6 +55,7 @@ message SmartContract { int64 origin_energy_limit = 8; bytes code_hash = 9; bytes trx_hash = 10; + int32 version = 11; } message CreateSmartContract { From c2cef7738ac1cd1c607e675534f0aea1b0b05e18 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Tue, 24 Aug 2021 11:13:40 +0800 Subject: [PATCH 145/341] add expire time for txs cache --- framework/src/main/java/org/tron/core/db/Manager.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index b95a3c6c299..8c5a4fcf750 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -195,7 +195,8 @@ public class Manager { private BlockingQueue pushTransactionQueue = new LinkedBlockingQueue<>(); @Getter private Cache transactionIdCache = CacheBuilder - .newBuilder().maximumSize(TX_ID_CACHE_SIZE).recordStats().build(); + .newBuilder().maximumSize(TX_ID_CACHE_SIZE) + .expireAfterWrite(1, TimeUnit.HOURS).recordStats().build(); @Autowired private AccountStateCallBack accountStateCallBack; @Autowired From c368ce978aaeab44cc9589eac1b3d3bc7352316b Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Tue, 24 Aug 2021 11:18:57 +0800 Subject: [PATCH 146/341] feat: add jsonrpc config --- framework/src/main/resources/config.conf | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/framework/src/main/resources/config.conf b/framework/src/main/resources/config.conf index 2326876f17c..813250907df 100644 --- a/framework/src/main/resources/config.conf +++ b/framework/src/main/resources/config.conf @@ -216,6 +216,15 @@ node { # note: above APIs may return null even if blocks and transactions actually are on the blockchain # when opening on a lite fullnode. only open it if the consequences being clearly known # openHistoryQueryWhenLiteFN = false + + jsonrpc { + # httpFullNodeEnable = true + # httpFullNodePort = 8545 + # httpSolidityEnable = true + # httpSolidityPort = 8555 + # httpPBFTEnable = true + # httpPBFTPort = 8565 + } } ## rate limiter config From 69f75894be832d58f9e19ca3c8c774297dc5c17e Mon Sep 17 00:00:00 2001 From: wubin01 Date: Tue, 24 Aug 2021 11:37:27 +0800 Subject: [PATCH 147/341] modify active check function --- .../org/tron/common/overlay/server/SyncPool.java | 13 +++++++++++++ .../java/org/tron/core/net/TronNetDelegate.java | 4 ---- .../org/tron/core/net/peer/PeerStatusCheck.java | 7 ------- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/framework/src/main/java/org/tron/common/overlay/server/SyncPool.java b/framework/src/main/java/org/tron/common/overlay/server/SyncPool.java index 311181c8efa..093a8ea5f0e 100644 --- a/framework/src/main/java/org/tron/common/overlay/server/SyncPool.java +++ b/framework/src/main/java/org/tron/common/overlay/server/SyncPool.java @@ -59,6 +59,8 @@ public class SyncPool { private PeerClient peerClient; + private int disconnectTimeout = 10_000; + public void init() { channelManager = ctx.getBean(ChannelManager.class); @@ -67,6 +69,7 @@ public void init() { poolLoopExecutor.scheduleWithFixedDelay(() -> { try { + check(); fillUp(); } catch (Throwable t) { logger.error("Exception in sync worker", t); @@ -82,6 +85,16 @@ public void init() { }, 30, 10, TimeUnit.SECONDS); } + private void check() { + activePeers.forEach(peer -> { + long now = System.currentTimeMillis(); + long disconnectTime = peer.getDisconnectTime(); + if (disconnectTime != 0 && now - disconnectTime > disconnectTimeout) { + channelManager.notifyDisconnect(peer); + } + }); + } + private void fillUp() { List connectNodes = new ArrayList<>(); Set addressInUse = new HashSet<>(); diff --git a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java index b8e29908842..2dea62273f7 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java +++ b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java @@ -102,10 +102,6 @@ public void trustNode(PeerConnection peer) { channelManager.getTrustNodes().put(peer.getInetAddress(), peer.getNode()); } - public void notifyDisconnect(Channel channel){ - channelManager.notifyDisconnect(channel); - } - public Collection getActivePeer() { return syncPool.getActivePeers(); } diff --git a/framework/src/main/java/org/tron/core/net/peer/PeerStatusCheck.java b/framework/src/main/java/org/tron/core/net/peer/PeerStatusCheck.java index 77c3595cf43..6600238fcc5 100644 --- a/framework/src/main/java/org/tron/core/net/peer/PeerStatusCheck.java +++ b/framework/src/main/java/org/tron/core/net/peer/PeerStatusCheck.java @@ -22,8 +22,6 @@ public class PeerStatusCheck { private int blockUpdateTimeout = 30_000; - private int disconnectTimeout = 10_000; - public void init() { peerStatusCheckExecutor.scheduleWithFixedDelay(() -> { try { @@ -44,11 +42,6 @@ public void statusCheck() { tronNetDelegate.getActivePeer().forEach(peer -> { - long disconnectTime = peer.getDisconnectTime(); - if (disconnectTime != 0 && now - disconnectTime > disconnectTimeout) { - tronNetDelegate.notifyDisconnect(peer); - } - boolean isDisconnected = false; if (peer.isNeedSyncFromPeer() From d295a34c1102f85ec5236e31b8a99ca5ced12613 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Tue, 24 Aug 2021 11:41:04 +0800 Subject: [PATCH 148/341] remove unuse dependency --- framework/src/main/java/org/tron/core/net/TronNetDelegate.java | 1 - 1 file changed, 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java index 2dea62273f7..f19b9df9ebf 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java +++ b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java @@ -13,7 +13,6 @@ import org.springframework.stereotype.Component; import org.tron.common.backup.BackupServer; import org.tron.common.overlay.message.Message; -import org.tron.common.overlay.server.Channel; import org.tron.common.overlay.server.ChannelManager; import org.tron.common.overlay.server.SyncPool; import org.tron.common.utils.Sha256Hash; From 4afb3a59bed3b0ff46878b2821415871de059276 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Tue, 24 Aug 2021 14:37:36 +0800 Subject: [PATCH 149/341] feat: rename HttpAccessFilte to HttpApiAccessFilte and ApiAccessInterceptor to RpcApiAccessInterceptor --- .../org/tron/core/services/RpcApiService.java | 6 +++--- ...essFilter.java => HttpApiAccessFilter.java} | 6 ++++-- .../services/http/FullNodeHttpApiService.java | 18 ++++++++---------- .../solidity/SolidityNodeHttpApiService.java | 14 +++++++------- .../interfaceOnPBFT/RpcApiServiceOnPBFT.java | 8 ++++---- .../http/PBFT/HttpApiOnPBFTService.java | 16 +++++++--------- .../RpcApiServiceOnSolidity.java | 8 ++++---- .../solidity/HttpApiOnSolidityService.java | 14 ++++++-------- ...eptor.java => RpcApiAccessInterceptor.java} | 6 +----- 9 files changed, 44 insertions(+), 52 deletions(-) rename framework/src/main/java/org/tron/core/services/filter/{HttpAccessFilter.java => HttpApiAccessFilter.java} (88%) rename framework/src/main/java/org/tron/core/services/ratelimiter/{ApiAccessInterceptor.java => RpcApiAccessInterceptor.java} (86%) diff --git a/framework/src/main/java/org/tron/core/services/RpcApiService.java b/framework/src/main/java/org/tron/core/services/RpcApiService.java index 597355dd3f9..004df06c245 100755 --- a/framework/src/main/java/org/tron/core/services/RpcApiService.java +++ b/framework/src/main/java/org/tron/core/services/RpcApiService.java @@ -112,8 +112,8 @@ import org.tron.core.exception.ZksnarkException; import org.tron.core.metrics.MetricsApiService; import org.tron.core.services.filter.LiteFnQueryGrpcInterceptor; -import org.tron.core.services.ratelimiter.ApiAccessInterceptor; import org.tron.core.services.ratelimiter.RateLimiterInterceptor; +import org.tron.core.services.ratelimiter.RpcApiAccessInterceptor; import org.tron.core.utils.TransactionUtil; import org.tron.core.zen.address.DiversifierT; import org.tron.core.zen.address.IncomingViewingKey; @@ -203,7 +203,7 @@ public class RpcApiService implements Service { @Autowired private LiteFnQueryGrpcInterceptor liteFnQueryGrpcInterceptor; @Autowired - private ApiAccessInterceptor apiAccessInterceptor; + private RpcApiAccessInterceptor apiAccessInterceptor; @Autowired private MetricsApiService metricsApiService; @@ -264,7 +264,7 @@ public void start() { // add lite fullnode query interceptor serverBuilder.intercept(liteFnQueryGrpcInterceptor); - // add api access interceptor + // add api access interceptor, this should have highest priority serverBuilder.intercept(apiAccessInterceptor); apiServer = serverBuilder.build(); diff --git a/framework/src/main/java/org/tron/core/services/filter/HttpAccessFilter.java b/framework/src/main/java/org/tron/core/services/filter/HttpApiAccessFilter.java similarity index 88% rename from framework/src/main/java/org/tron/core/services/filter/HttpAccessFilter.java rename to framework/src/main/java/org/tron/core/services/filter/HttpApiAccessFilter.java index 23ca62738e0..d3188c68c21 100644 --- a/framework/src/main/java/org/tron/core/services/filter/HttpAccessFilter.java +++ b/framework/src/main/java/org/tron/core/services/filter/HttpApiAccessFilter.java @@ -9,9 +9,11 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +@Component @Slf4j(topic = "httpAccessFilter") -public class HttpAccessFilter implements Filter { +public class HttpApiAccessFilter implements Filter { private String endpoint; @@ -42,8 +44,8 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha } } catch (Exception e) { + logger.error("http api access filter exception: {}", e.getMessage()); } - } @Override diff --git a/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java b/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java index a243379fb37..b561bfb0cc7 100644 --- a/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java +++ b/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java @@ -22,7 +22,7 @@ import org.tron.common.zksnark.LibrustzcashParam.InitZksnarkParams; import org.tron.core.config.args.Args; import org.tron.core.exception.ZksnarkException; -import org.tron.core.services.filter.HttpAccessFilter; +import org.tron.core.services.filter.HttpApiAccessFilter; import org.tron.core.services.filter.HttpInterceptor; import org.tron.core.services.filter.LiteFnQueryHttpFilter; @@ -280,6 +280,8 @@ public class FullNodeHttpApiService implements Service { @Autowired private LiteFnQueryHttpFilter liteFnQueryHttpFilter; @Autowired + private HttpApiAccessFilter httpApiAccessFilter; + @Autowired private GetTransactionFromPendingServlet getTransactionFromPendingServlet; @Autowired private GetTransactionListFromPendingServlet getTransactionListFromPendingServlet; @@ -541,21 +543,17 @@ public void start() { context.addFilter(new FilterHolder(liteFnQueryHttpFilter), "/*", EnumSet.allOf(DispatcherType.class)); + // http access filter, it should have high priority than HttpInterceptor + context.addFilter(new FilterHolder(httpApiAccessFilter), "/*", + EnumSet.allOf(DispatcherType.class)); + // filter ServletHandler handler = new ServletHandler(); - FilterHolder fh = handler.addFilterWithMapping((Class) HttpAccessFilter.class, "/*", - EnumSet.of(DispatcherType.REQUEST)); - context.addFilter(fh, "/*", EnumSet.of(DispatcherType.REQUEST)); - - handler = new ServletHandler(); - fh = handler + FilterHolder fh = handler .addFilterWithMapping((Class) HttpInterceptor.class, "/*", EnumSet.of(DispatcherType.REQUEST)); context.addFilter(fh, "/*", EnumSet.of(DispatcherType.REQUEST)); - - - server.start(); } catch (Exception e) { logger.debug("IOException: {}", e.getMessage()); diff --git a/framework/src/main/java/org/tron/core/services/http/solidity/SolidityNodeHttpApiService.java b/framework/src/main/java/org/tron/core/services/http/solidity/SolidityNodeHttpApiService.java index 0bd2ff66e7f..896b274c7c9 100644 --- a/framework/src/main/java/org/tron/core/services/http/solidity/SolidityNodeHttpApiService.java +++ b/framework/src/main/java/org/tron/core/services/http/solidity/SolidityNodeHttpApiService.java @@ -15,7 +15,7 @@ import org.tron.common.application.Service; import org.tron.common.parameter.CommonParameter; import org.tron.core.config.args.Args; -import org.tron.core.services.filter.HttpAccessFilter; +import org.tron.core.services.filter.HttpApiAccessFilter; import org.tron.core.services.http.FullNodeHttpApiService; import org.tron.core.services.http.GetAccountByIdServlet; import org.tron.core.services.http.GetAccountServlet; @@ -146,6 +146,9 @@ public class SolidityNodeHttpApiService implements Service { @Autowired private GetTransactionInfoByBlockNumServlet getTransactionInfoByBlockNumServlet; + @Autowired + private HttpApiAccessFilter httpApiAccessFilter; + @Override public void init() { } @@ -247,12 +250,9 @@ public void start() { context.addServlet(new ServletHolder(getRewardServlet), "/walletsolidity/getReward"); context.addServlet(new ServletHolder(getBurnTrxServlet), "/walletsolidity/getburntrx"); - // filter - ServletHandler handler = new ServletHandler(); - FilterHolder - fh = handler.addFilterWithMapping((Class) HttpAccessFilter.class, "/*", - EnumSet.of(DispatcherType.REQUEST)); - context.addFilter(fh, "/*", EnumSet.of(DispatcherType.REQUEST)); + // http access filter + context.addFilter(new FilterHolder(httpApiAccessFilter), "/*", + EnumSet.allOf(DispatcherType.class)); int maxHttpConnectNumber = Args.getInstance().getMaxHttpConnectNumber(); if (maxHttpConnectNumber > 0) { diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java index 9c966ffa037..289cfda1fd9 100755 --- a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java @@ -40,8 +40,8 @@ import org.tron.core.config.args.Args; import org.tron.core.services.RpcApiService; import org.tron.core.services.filter.LiteFnQueryGrpcInterceptor; -import org.tron.core.services.ratelimiter.ApiAccessInterceptor; import org.tron.core.services.ratelimiter.RateLimiterInterceptor; +import org.tron.core.services.ratelimiter.RpcApiAccessInterceptor; import org.tron.protos.Protocol.Account; import org.tron.protos.Protocol.Block; import org.tron.protos.Protocol.DynamicProperties; @@ -77,7 +77,7 @@ public class RpcApiServiceOnPBFT implements Service { private LiteFnQueryGrpcInterceptor liteFnQueryGrpcInterceptor; @Autowired - private ApiAccessInterceptor apiAccessInterceptor; + private RpcApiAccessInterceptor apiAccessInterceptor; @Override public void init() { @@ -109,7 +109,7 @@ public void start() { .flowControlWindow(args.getFlowControlWindow()) .maxConnectionIdle(args.getMaxConnectionIdleInMillis(), TimeUnit.MILLISECONDS) .maxConnectionAge(args.getMaxConnectionAgeInMillis(), TimeUnit.MILLISECONDS) - .maxMessageSize(args.getMaxMessageSize()) + .maxInboundMessageSize(args.getMaxMessageSize()) .maxHeaderListSize(args.getMaxHeaderListSize()); // add a ratelimiter interceptor @@ -118,7 +118,7 @@ public void start() { // add lite fullnode query interceptor serverBuilder.intercept(liteFnQueryGrpcInterceptor); - // add api access interceptor + // add api access interceptor, this should have highest priority serverBuilder.intercept(apiAccessInterceptor); apiServer = serverBuilder.build(); diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/PBFT/HttpApiOnPBFTService.java b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/PBFT/HttpApiOnPBFTService.java index 52de7aebe1e..e080700c214 100644 --- a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/PBFT/HttpApiOnPBFTService.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/PBFT/HttpApiOnPBFTService.java @@ -2,19 +2,17 @@ import java.util.EnumSet; import javax.servlet.DispatcherType; -import javax.servlet.Filter; import lombok.extern.slf4j.Slf4j; import org.eclipse.jetty.server.ConnectionLimit; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.ServletHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.springframework.beans.factory.annotation.Autowired; import org.tron.common.application.Service; import org.tron.common.parameter.CommonParameter; import org.tron.core.config.args.Args; -import org.tron.core.services.filter.HttpAccessFilter; +import org.tron.core.services.filter.HttpApiAccessFilter; import org.tron.core.services.filter.LiteFnQueryHttpFilter; import org.tron.core.services.interfaceOnPBFT.http.GetAccountByIdOnPBFTServlet; import org.tron.core.services.interfaceOnPBFT.http.GetAccountOnPBFTServlet; @@ -126,6 +124,8 @@ public class HttpApiOnPBFTService implements Service { @Autowired private LiteFnQueryHttpFilter liteFnQueryHttpFilter; + @Autowired + private HttpApiAccessFilter httpApiAccessFilter; @Autowired private GetMarketOrderByAccountOnPBFTServlet getMarketOrderByAccountOnPBFTServlet; @@ -233,12 +233,6 @@ public void start() { context.addServlet(new ServletHolder(getBurnTrxOnPBFTServlet), "/getburntrx"); - // filter - ServletHandler handler = new ServletHandler(); - FilterHolder fh = handler.addFilterWithMapping((Class) HttpAccessFilter.class, "/*", - EnumSet.of(DispatcherType.REQUEST)); - context.addFilter(fh, "/*", EnumSet.of(DispatcherType.REQUEST)); - int maxHttpConnectNumber = Args.getInstance().getMaxHttpConnectNumber(); if (maxHttpConnectNumber > 0) { server.addBean(new ConnectionLimit(maxHttpConnectNumber, server)); @@ -249,6 +243,10 @@ public void start() { context.addFilter(new FilterHolder(liteFnQueryHttpFilter), "/*", EnumSet.allOf(DispatcherType.class)); + // api access filter + context.addFilter(new FilterHolder(httpApiAccessFilter), "/*", + EnumSet.allOf(DispatcherType.class)); + server.start(); } catch (Exception e) { logger.debug("IOException: {}", e.getMessage()); diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java index 9e62d238d56..a5b83fab2e6 100755 --- a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java @@ -42,8 +42,8 @@ import org.tron.core.config.args.Args; import org.tron.core.services.RpcApiService; import org.tron.core.services.filter.LiteFnQueryGrpcInterceptor; -import org.tron.core.services.ratelimiter.ApiAccessInterceptor; import org.tron.core.services.ratelimiter.RateLimiterInterceptor; +import org.tron.core.services.ratelimiter.RpcApiAccessInterceptor; import org.tron.protos.Protocol.Account; import org.tron.protos.Protocol.Block; import org.tron.protos.Protocol.DynamicProperties; @@ -79,7 +79,7 @@ public class RpcApiServiceOnSolidity implements Service { private LiteFnQueryGrpcInterceptor liteFnQueryGrpcInterceptor; @Autowired - private ApiAccessInterceptor apiAccessInterceptor; + private RpcApiAccessInterceptor apiAccessInterceptor; @Override public void init() { @@ -109,7 +109,7 @@ public void start() { .flowControlWindow(parameter.getFlowControlWindow()) .maxConnectionIdle(parameter.getMaxConnectionIdleInMillis(), TimeUnit.MILLISECONDS) .maxConnectionAge(parameter.getMaxConnectionAgeInMillis(), TimeUnit.MILLISECONDS) - .maxMessageSize(parameter.getMaxMessageSize()) + .maxInboundMessageSize(parameter.getMaxMessageSize()) .maxHeaderListSize(parameter.getMaxHeaderListSize()); // add a ratelimiter interceptor @@ -118,7 +118,7 @@ public void start() { // add lite fullnode query interceptor serverBuilder.intercept(liteFnQueryGrpcInterceptor); - // add api access interceptor + // add api access interceptor, this should have highest priority serverBuilder.intercept(apiAccessInterceptor); apiServer = serverBuilder.build(); diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java index 3aaf4f4af8d..143fa4171e3 100644 --- a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java @@ -14,7 +14,7 @@ import org.tron.common.application.Service; import org.tron.common.parameter.CommonParameter; import org.tron.core.config.args.Args; -import org.tron.core.services.filter.HttpAccessFilter; +import org.tron.core.services.filter.HttpApiAccessFilter; import org.tron.core.services.filter.LiteFnQueryHttpFilter; import org.tron.core.services.interfaceOnSolidity.http.GetAccountByIdOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.GetAccountOnSolidityServlet; @@ -150,8 +150,8 @@ public class HttpApiOnSolidityService implements Service { @Autowired private LiteFnQueryHttpFilter liteFnQueryHttpFilter; - // @Autowired - // private HttpAccessFilter httpAccessFilter; + @Autowired + private HttpApiAccessFilter httpApiAccessFilter; @Override public void init() { @@ -256,11 +256,9 @@ public void start() { context.addFilter(new FilterHolder(liteFnQueryHttpFilter), "/*", EnumSet.allOf(DispatcherType.class)); - // filter - ServletHandler handler = new ServletHandler(); - FilterHolder fh = handler.addFilterWithMapping((Class) HttpAccessFilter.class, "/*", - EnumSet.of(DispatcherType.REQUEST)); - context.addFilter(fh, "/*", EnumSet.of(DispatcherType.REQUEST)); + // api access filter + context.addFilter(new FilterHolder(httpApiAccessFilter), "/*", + EnumSet.allOf(DispatcherType.class)); int maxHttpConnectNumber = Args.getInstance().getMaxHttpConnectNumber(); if (maxHttpConnectNumber > 0) { diff --git a/framework/src/main/java/org/tron/core/services/ratelimiter/ApiAccessInterceptor.java b/framework/src/main/java/org/tron/core/services/ratelimiter/RpcApiAccessInterceptor.java similarity index 86% rename from framework/src/main/java/org/tron/core/services/ratelimiter/ApiAccessInterceptor.java rename to framework/src/main/java/org/tron/core/services/ratelimiter/RpcApiAccessInterceptor.java index 12622d503fc..a6a4ed5da29 100644 --- a/framework/src/main/java/org/tron/core/services/ratelimiter/ApiAccessInterceptor.java +++ b/framework/src/main/java/org/tron/core/services/ratelimiter/RpcApiAccessInterceptor.java @@ -12,7 +12,7 @@ @Slf4j @Component -public class ApiAccessInterceptor implements ServerInterceptor { +public class RpcApiAccessInterceptor implements ServerInterceptor { @Override public Listener interceptCall(ServerCall call, Metadata headers, @@ -20,8 +20,6 @@ public Listener interceptCall(ServerCall call, String fullMethodName = call.getMethodDescriptor().getFullMethodName(); - // Listener listener = new ServerCall.Listener() {}; - try { if (fullMethodName.split("/")[1].toLowerCase().equals("getnowblock2")) { call.close(Status.fromCode(Code.NOT_FOUND), new Metadata()); @@ -33,7 +31,5 @@ public Listener interceptCall(ServerCall call, logger.error("Rpc Api Error: {}", e.getMessage()); return next.startCall(call, headers); } - - // return listener; } } \ No newline at end of file From 8ed2ef21596d4ddcf43a4186edf6c9136b411eeb Mon Sep 17 00:00:00 2001 From: Asuka Date: Tue, 24 Aug 2021 15:15:12 +0800 Subject: [PATCH 150/341] rpc: adjust logic of some rpc interfaces - TriggerSmartContract: fee limit greater than max fee limit no longer throw validate exception, instead default set to max fee limit - TriggerConstantContract: cancel checking for call value and token value - TriggerConstantContract: return emitted logs and internal transactions after tvm execution in constant mode --- .../org/tron/core/actuator/VMActuator.java | 32 ++++------ .../core/capsule/utils/TransactionUtil.java | 64 ++++++++++--------- .../src/main/java/org/tron/core/Wallet.java | 10 +-- protocol/src/main/protos/api/api.proto | 2 + 4 files changed, 53 insertions(+), 55 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/actuator/VMActuator.java b/actuator/src/main/java/org/tron/core/actuator/VMActuator.java index f8738ccd3ca..7d777329005 100644 --- a/actuator/src/main/java/org/tron/core/actuator/VMActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/VMActuator.java @@ -178,13 +178,6 @@ public void execute(Object object) throws ContractExeException { result = program.getResult(); if (isConstantCall) { - long callValue = TransactionCapsule.getCallValue(trx.getRawData().getContract(0)); - long callTokenValue = TransactionUtil - .getCallTokenValue(trx.getRawData().getContract(0)); - if (callValue > 0 || callTokenValue > 0) { - result.setRuntimeError("constant cannot set call value or call token value."); - result.rejectInternalTransactions(); - } if (result.getException() != null) { result.setRuntimeError(result.getException().getMessage()); result.rejectInternalTransactions(); @@ -334,12 +327,7 @@ private void create() byte[] callerAddress = contract.getOwnerAddress().toByteArray(); // create vm to constructor smart contract try { - long feeLimit = trx.getRawData().getFeeLimit(); - if (feeLimit < 0 || feeLimit > repository.getDynamicPropertiesStore().getMaxFeeLimit()) { - logger.info("invalid feeLimit {}", feeLimit); - throw new ContractValidateException( - "feeLimit must be >= 0 and <= " + repository.getDynamicPropertiesStore().getMaxFeeLimit()); - } + long feeLimit = checkAndGetFeeLimit(); AccountCapsule creator = this.repository .getAccount(newSmartContract.getOriginAddress().toByteArray()); @@ -459,13 +447,7 @@ private void call() byte[] code = repository.getCode(contractAddress); if (isNotEmpty(code)) { - - long feeLimit = trx.getRawData().getFeeLimit(); - if (feeLimit < 0 || feeLimit > repository.getDynamicPropertiesStore().getMaxFeeLimit()) { - logger.info("invalid feeLimit {}", feeLimit); - throw new ContractValidateException( - "feeLimit must be >= 0 and <= " + repository.getDynamicPropertiesStore().getMaxFeeLimit()); - } + long feeLimit = checkAndGetFeeLimit(); AccountCapsule caller = repository.getAccount(callerAddress); long energyLimit; if (isConstantCall) { @@ -514,6 +496,16 @@ private void call() } + private long checkAndGetFeeLimit() throws ContractValidateException { + long txFeeLimit = trx.getRawData().getFeeLimit(); + if (txFeeLimit < 0) { + logger.info("invalid feeLimit {}", txFeeLimit); + throw new ContractValidateException("feeLimit must be >= 0"); + } + long maxFeeLimit = repository.getDynamicPropertiesStore().getMaxFeeLimit(); + return min(txFeeLimit, maxFeeLimit); + } + public long getAccountEnergyLimitWithFixRatio(AccountCapsule account, long feeLimit, long callValue) { diff --git a/chainbase/src/main/java/org/tron/core/capsule/utils/TransactionUtil.java b/chainbase/src/main/java/org/tron/core/capsule/utils/TransactionUtil.java index 52f1889b83e..a2c3facd565 100644 --- a/chainbase/src/main/java/org/tron/core/capsule/utils/TransactionUtil.java +++ b/chainbase/src/main/java/org/tron/core/capsule/utils/TransactionUtil.java @@ -122,42 +122,44 @@ public static TransactionInfoCapsule buildTransactionInfoInstance(TransactionCap builder.setReceipt(traceReceipt.getReceipt()); - if (CommonParameter.getInstance().isSaveInternalTx() && null != programResult - .getInternalTransactions()) { - for (InternalTransaction internalTransaction : programResult - .getInternalTransactions()) { - Protocol.InternalTransaction.Builder internalTrxBuilder = Protocol.InternalTransaction - .newBuilder(); - // set hash - internalTrxBuilder.setHash(ByteString.copyFrom(internalTransaction.getHash())); - // set caller - internalTrxBuilder.setCallerAddress(ByteString.copyFrom(internalTransaction.getSender())); - // set TransferTo - internalTrxBuilder - .setTransferToAddress(ByteString.copyFrom(internalTransaction.getTransferToAddress())); - //TODO: "for loop" below in future for multiple token case, we only have one for now. - Protocol.InternalTransaction.CallValueInfo.Builder callValueInfoBuilder = - Protocol.InternalTransaction.CallValueInfo.newBuilder(); - // trx will not be set token name - callValueInfoBuilder.setCallValue(internalTransaction.getValue()); - // Just one transferBuilder for now. - internalTrxBuilder.addCallValueInfo(callValueInfoBuilder); - internalTransaction.getTokenInfo().forEach((tokenId, amount) -> { - internalTrxBuilder.addCallValueInfo( - Protocol.InternalTransaction.CallValueInfo.newBuilder().setTokenId(tokenId) - .setCallValue(amount)); - }); - // Token for loop end here - internalTrxBuilder.setNote(ByteString.copyFrom(internalTransaction.getNote().getBytes())); - internalTrxBuilder.setRejected(internalTransaction.isRejected()); - internalTrxBuilder.setExtra(internalTransaction.getExtra()); - builder.addInternalTransactions(internalTrxBuilder); - } + if (CommonParameter.getInstance().isSaveInternalTx()) { + programResult.getInternalTransactions().forEach(it -> + builder.addInternalTransactions(buildInternalTransaction(it))); } return new TransactionInfoCapsule(builder.build()); } + public static Protocol.InternalTransaction buildInternalTransaction(InternalTransaction it) { + Protocol.InternalTransaction.Builder itBuilder = Protocol.InternalTransaction + .newBuilder(); + // set hash + itBuilder.setHash(ByteString.copyFrom(it.getHash())); + // set caller + itBuilder.setCallerAddress(ByteString.copyFrom(it.getSender())); + // set TransferTo + itBuilder.setTransferToAddress(ByteString.copyFrom(it.getTransferToAddress())); + //TODO: "for loop" below in future for multiple token case, we only have one for now. + Protocol.InternalTransaction.CallValueInfo.Builder callValueInfoBuilder = + Protocol.InternalTransaction.CallValueInfo.newBuilder(); + // trx will not be set token name + callValueInfoBuilder.setCallValue(it.getValue()); + // Just one transferBuilder for now. + itBuilder.addCallValueInfo(callValueInfoBuilder); + it.getTokenInfo().forEach((tokenId, amount) -> + itBuilder.addCallValueInfo( + Protocol.InternalTransaction.CallValueInfo.newBuilder() + .setTokenId(tokenId) + .setCallValue(amount) + ) + ); + // Token for loop end here + itBuilder.setNote(ByteString.copyFrom(it.getNote().getBytes())); + itBuilder.setRejected(it.isRejected()); + itBuilder.setExtra(it.getExtra()); + return itBuilder.build(); + } + public static boolean isNumber(byte[] id) { if (ArrayUtils.isEmpty(id)) { return false; diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index 073ad81cf5a..f37a6ac1430 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -104,6 +104,7 @@ import org.tron.common.overlay.message.Message; import org.tron.common.parameter.CommonParameter; import org.tron.common.runtime.ProgramResult; +import org.tron.common.runtime.vm.LogInfo; import org.tron.common.utils.ByteArray; import org.tron.common.utils.ByteUtil; import org.tron.common.utils.DecodeUtil; @@ -146,6 +147,7 @@ import org.tron.core.capsule.TransactionRetCapsule; import org.tron.core.capsule.WitnessCapsule; import org.tron.core.capsule.utils.MarketUtils; +import org.tron.core.capsule.utils.TransactionUtil; import org.tron.core.config.args.Args; import org.tron.core.db.BandwidthProcessor; import org.tron.core.db.BlockIndexStore; @@ -181,7 +183,6 @@ import org.tron.core.store.MarketPairPriceToOrderStore; import org.tron.core.store.MarketPairToPriceStore; import org.tron.core.store.StoreFactory; -import org.tron.core.utils.TransactionUtil; import org.tron.core.zen.ShieldedTRC20ParametersBuilder; import org.tron.core.zen.ShieldedTRC20ParametersBuilder.ShieldedTRC20ParametersType; import org.tron.core.zen.ZenTransactionBuilder; @@ -266,9 +267,6 @@ public class Wallet { public static final String CONTRACT_VALIDATE_EXCEPTION = "ContractValidateException: {}"; public static final String CONTRACT_VALIDATE_ERROR = "contract validate error : "; - @Autowired - private TransactionUtil transactionUtil; - /** * Creates a new Wallet with a random ECKey. */ @@ -2576,6 +2574,10 @@ public Transaction callConstantContract(TransactionCapsule trxCap, Builder TransactionResultCapsule ret = new TransactionResultCapsule(); builder.setEnergyUsed(result.getEnergyUsed()); builder.addConstantResult(ByteString.copyFrom(result.getHReturn())); + result.getLogInfoList().forEach(logInfo -> + builder.addLogs(LogInfo.buildLog(logInfo))); + result.getInternalTransactions().forEach(it -> + builder.addInternalTransactions(TransactionUtil.buildInternalTransaction(it))); ret.setStatus(0, code.SUCESS); if (StringUtils.isNoneEmpty(result.getRuntimeError())) { ret.setStatus(0, code.FAILED); diff --git a/protocol/src/main/protos/api/api.proto b/protocol/src/main/protos/api/api.proto index 3766873318f..5f697026c10 100644 --- a/protocol/src/main/protos/api/api.proto +++ b/protocol/src/main/protos/api/api.proto @@ -1222,6 +1222,8 @@ message TransactionExtention { repeated bytes constant_result = 3; Return result = 4; int64 energy_used = 5; + repeated TransactionInfo.Log logs = 6; + repeated InternalTransaction internal_transactions = 7; } message BlockExtention { From c8939bdde157ae243cf663c189868076a5ce4725 Mon Sep 17 00:00:00 2001 From: Asuka Date: Tue, 24 Aug 2021 15:34:11 +0800 Subject: [PATCH 151/341] feature: increase upper limit from 1e10 to 1e17 for MAX_FEE_LIMIT --- .../java/org/tron/core/utils/ProposalUtil.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java b/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java index bdb161d52ff..6180d6d3e7d 100644 --- a/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java +++ b/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java @@ -383,9 +383,17 @@ public static void validator(DynamicPropertiesStore dynamicPropertiesStore, if (!forkController.pass(ForkBlockVersionEnum.VERSION_4_1_2)) { throw new ContractValidateException("Bad chain parameter id [MAX_FEE_LIMIT]"); } - if (value < 0 || value > 10_000_000_000L) { - throw new ContractValidateException( - "Bad MAX_FEE_LIMIT parameter value, valid range is [0,10_000_000_000L]"); + if (value < 0) { + throw new ContractValidateException( + "Bad MAX_FEE_LIMIT parameter value, value must not be negative"); + } else if (value > 10_000_000_000L) { + if (dynamicPropertiesStore.getAllowTvmLondon() == 0) { + throw new ContractValidateException( + "Bad MAX_FEE_LIMIT parameter value, valid range is [0,10_000_000_000L]"); + } + if (value > LONG_VALUE) { + throw new ContractValidateException(LONG_VALUE_ERROR); + } } break; } From de1e9f0c60fe5e04589b0ddd6414a5334d87a32e Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Tue, 24 Aug 2021 16:16:25 +0800 Subject: [PATCH 152/341] feat: get block info from transactionCapsule if no transactionInfo --- .../src/main/java/org/tron/core/Wallet.java | 17 ++++- .../core/services/jsonrpc/JsonRpcApiUtil.java | 15 +++++ .../services/jsonrpc/TransactionReceipt.java | 3 - .../services/jsonrpc/TransactionResult.java | 67 ++----------------- .../core/services/jsonrpc/TronJsonRpc.java | 4 +- .../services/jsonrpc/TronJsonRpcImpl.java | 40 +++++++---- 6 files changed, 63 insertions(+), 83 deletions(-) diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index eba98d8b74b..895e2e76e44 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -248,8 +248,6 @@ public class Wallet { .fromString("TokenBurn(address,uint256,bytes32[3])")); private static final String BROADCAST_TRANS_FAILED = "Broadcast transaction {} failed, {}."; - private boolean energyPriceHistoryLoaded = false; - @Getter private final SignInterface cryptoEngine; @Autowired @@ -1370,6 +1368,21 @@ public Transaction getTransactionById(ByteString transactionId) { return null; } + public TransactionCapsule getTransactionCapsuleById(ByteString transactionId) { + if (Objects.isNull(transactionId)) { + return null; + } + TransactionCapsule transactionCapsule; + try { + transactionCapsule = chainBaseManager.getTransactionStore() + .get(transactionId.toByteArray()); + } catch (StoreException e) { + return null; + } + + return transactionCapsule; + } + public TransactionInfo getTransactionInfoById(ByteString transactionId) { if (Objects.isNull(transactionId)) { return null; diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index a88c861263b..c4cba6f0784 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -525,4 +525,19 @@ public static long getEnergyUsageTotal(List transactionInfoList return energyUsageTotal; } + + public static int getTransactionIndex(String txId, List txList) { + int transactionIndex = -1; + Transaction transaction; + + for (int index = 0; index < txList.size(); index++) { + transaction = txList.get(index); + if (getTxID(transaction).equals(txId)) { + transactionIndex = index; + break; + } + } + + return transactionIndex; + } } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java index 59ff35c784b..de4464758b0 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java @@ -113,9 +113,6 @@ public TransactionReceipt(Protocol.Block block, TransactionInfo txInfo, Wallet w byte[] addressByte = convertToTronAddress(log.getAddress().toByteArray()); transactionLog.address = ByteArray.toJsonHexAddress(addressByte); transactionLog.data = ByteArray.toJsonHex(log.getData().toByteArray()); - if (transactionLog.data == null) { - transactionLog.data = "0x"; - } String[] topics = new String[log.getTopicsCount()]; for (int i = 0; i < log.getTopicsCount(); i++) { diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java index 27c4f389d50..dc67b998e69 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java @@ -5,6 +5,7 @@ import com.google.protobuf.ByteString; import java.util.Arrays; +import lombok.ToString; import org.tron.common.utils.ByteArray; import org.tron.core.Wallet; import org.tron.core.capsule.BlockCapsule; @@ -12,6 +13,7 @@ import org.tron.protos.Protocol; import org.tron.protos.Protocol.Transaction.Contract; +@ToString public class TransactionResult { public String hash; @@ -33,8 +35,8 @@ public class TransactionResult { public TransactionResult(BlockCapsule blockCapsule, int index, Protocol.Transaction tx, long energyUsageTotal, long energyFee, Wallet wallet) { - byte[] txid = new TransactionCapsule(tx).getTransactionId().getBytes(); - hash = ByteArray.toJsonHex(txid); + byte[] txId = new TransactionCapsule(tx).getTransactionId().getBytes(); + hash = ByteArray.toJsonHex(txId); nonce = null; // no value blockHash = ByteArray.toJsonHex(blockCapsule.getBlockId().getBytes()); blockNumber = ByteArray.toJsonHex(blockCapsule.getNum()); @@ -66,65 +68,4 @@ public TransactionResult(BlockCapsule blockCapsule, int index, Protocol.Transact r = ByteArray.toJsonHex(rByte); s = ByteArray.toJsonHex(sByte); } - - // gasPrice from blockCapsule - public TransactionResult(BlockCapsule blockCapsule, int index, Protocol.Transaction tx, - long energyUsageTotal, Wallet wallet) { - this(blockCapsule, index, tx, energyUsageTotal, 0, wallet); - - gas = ByteArray.toJsonHex(energyUsageTotal); - gasPrice = ByteArray.toJsonHex(wallet.getEnergyFee(blockCapsule.getTimeStamp())); - } - - public TransactionResult(Protocol.Transaction tx, Wallet wallet) { - byte[] txid = new TransactionCapsule(tx).getTransactionId().getBytes(); - hash = ByteArray.toJsonHex(txid); - nonce = null; // no value - blockHash = "0x"; - blockNumber = "0x"; - transactionIndex = "0x"; - - if (!tx.getRawData().getContractList().isEmpty()) { - Contract contract = tx.getRawData().getContract(0); - byte[] fromByte = TransactionCapsule.getOwner(contract); - byte[] toByte = getToAddress(tx); - from = ByteArray.toJsonHexAddress(fromByte); - to = ByteArray.toJsonHexAddress(toByte); - value = ByteArray.toJsonHex(getTransactionAmount(contract, hash, wallet)); - } else { - from = null; - to = null; - value = null; - } - - gas = "0x0"; - gasPrice = "0x"; - input = ByteArray.toJsonHex(tx.getRawData().getData().toByteArray()); - - ByteString signature = tx.getSignature(0); // r[32] + s[32] + v[1] - byte[] signData = signature.toByteArray(); - byte vByte = (byte) (signData[64] + 27); // according to Base64toBytes - byte[] rByte = Arrays.copyOfRange(signData, 0, 32); - byte[] sByte = Arrays.copyOfRange(signData, 32, 64); - v = ByteArray.toJsonHex(vByte); - r = ByteArray.toJsonHex(rByte); - s = ByteArray.toJsonHex(sByte); - } - - @Override - public String toString() { - return "TransactionResult{" - + "hash='" + hash + '\'' - + ", nonce='" + nonce + '\'' - + ", blockHash='" + blockHash + '\'' - + ", blockNumber='" + blockNumber + '\'' - + ", transactionIndex='" + transactionIndex + '\'' - + ", from='" + from + '\'' - + ", to='" + to + '\'' - + ", gas='" + gas + '\'' - + ", gasPrice='" + gasPrice + '\'' - + ", value='" + value + '\'' - + ", input='" + input + '\'' - + '}'; - } } \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 59f0a683399..7f5cd3d4275 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -219,7 +219,7 @@ String estimateGas(CallArguments args) throws JsonRpcInvalidRequestException, @JsonRpcErrors({ @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), }) - TransactionResult getTransactionByHash(String txid) throws JsonRpcInvalidParamsException; + TransactionResult getTransactionByHash(String txId) throws JsonRpcInvalidParamsException; @JsonRpcMethod("eth_getTransactionByBlockHashAndIndex") @JsonRpcErrors({ @@ -341,7 +341,7 @@ TransactionJson buildTransaction(BuildArguments args) @JsonRpcErrors({ @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), }) - CompilationResult ethCompileSolidity(String contract) throws Exception; + CompilationResult ethCompileSolidity(String contract); @JsonRpcMethod("eth_compileLLL") @JsonRpcErrors({ diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 15eb0f2ac2f..a3f45047e53 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -6,6 +6,7 @@ import static org.tron.core.services.http.Util.setTransactionPermissionId; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.addressHashToByteArray; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getEnergyUsageTotal; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTransactionIndex; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTxID; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.triggerCallContract; @@ -486,17 +487,28 @@ public CompilationResult ethSubmitHashrate(String hashrate, String id) { } @Override - public TransactionResult getTransactionByHash(String txid) throws JsonRpcInvalidParamsException { - ByteString transactionId = ByteString.copyFrom(hashToByteArray(txid)); + public TransactionResult getTransactionByHash(String txId) throws JsonRpcInvalidParamsException { + ByteString transactionId = ByteString.copyFrom(hashToByteArray(txId)); TransactionInfo transactionInfo = wallet.getTransactionInfoById(transactionId); if (transactionInfo == null) { - Transaction transaction = wallet.getTransactionById(transactionId); - if (transaction == null) { + TransactionCapsule transactionCapsule = wallet.getTransactionCapsuleById(transactionId); + if (transactionCapsule == null) { return null; } - return new TransactionResult(transaction, wallet); + BlockCapsule blockCapsule = wallet.getBlockCapsuleByNum(transactionCapsule.getBlockNum()); + int transactionIndex = getTransactionIndex( + ByteArray.toHexString(transactionCapsule.getTransactionId().getBytes()), + blockCapsule.getInstance().getTransactionsList()); + + if (transactionIndex == -1) { + return null; + } + + long energyUsageTotal = 0; + return new TransactionResult(blockCapsule, transactionIndex, transactionCapsule.getInstance(), + energyUsageTotal, wallet.getEnergyFee(blockCapsule.getTimeStamp()), wallet); } Block block = wallet.getBlockByNum(transactionInfo.getBlockNumber()); @@ -508,7 +520,7 @@ public TransactionResult getTransactionByHash(String txid) throws JsonRpcInvalid } private TransactionResult formatTransactionResult(TransactionInfo transactioninfo, Block block) { - String txid = ByteArray.toHexString(transactioninfo.getId().toByteArray()); + String txId = ByteArray.toHexString(transactioninfo.getId().toByteArray()); Transaction transaction = null; int transactionIndex = -1; @@ -516,7 +528,7 @@ private TransactionResult formatTransactionResult(TransactionInfo transactioninf List txList = block.getTransactionsList(); for (int index = 0; index < txList.size(); index++) { transaction = txList.get(index); - if (getTxID(transaction).equals(txid)) { + if (getTxID(transaction).equals(txId)) { transactionIndex = index; break; } @@ -527,8 +539,9 @@ private TransactionResult formatTransactionResult(TransactionInfo transactioninf } long energyUsageTotal = transactioninfo.getReceipt().getEnergyUsageTotal(); - return new TransactionResult(new BlockCapsule(block), transactionIndex, transaction, - energyUsageTotal, wallet); + BlockCapsule blockCapsule = new BlockCapsule(block); + return new TransactionResult(blockCapsule, transactionIndex, transaction, + energyUsageTotal, wallet.getEnergyFee(blockCapsule.getTimeStamp()), wallet); } public TransactionResult getTransactionByBlockAndIndex(Block block, String index) @@ -546,9 +559,10 @@ public TransactionResult getTransactionByBlockAndIndex(Block block, String index Transaction transaction = block.getTransactions(txIndex); long energyUsageTotal = getEnergyUsageTotal(transaction, wallet); + BlockCapsule blockCapsule = new BlockCapsule(block); - return new TransactionResult(new BlockCapsule(block), txIndex, transaction, energyUsageTotal, - wallet); + return new TransactionResult(blockCapsule, txIndex, transaction, energyUsageTotal, + wallet.getEnergyFee(blockCapsule.getTimeStamp()), wallet); } @Override @@ -575,10 +589,10 @@ public TransactionResult getTransactionByBlockNumberAndIndex(String blockNumOrTa } @Override - public TransactionReceipt getTransactionReceipt(String txid) + public TransactionReceipt getTransactionReceipt(String txId) throws JsonRpcInvalidParamsException { TransactionInfo transactionInfo = - wallet.getTransactionInfoById(ByteString.copyFrom(hashToByteArray(txid))); + wallet.getTransactionInfoById(ByteString.copyFrom(hashToByteArray(txId))); if (transactionInfo == null) { return null; } From 9e159c4ea9a77e6ab1b66abf43a6331533dd0b7b Mon Sep 17 00:00:00 2001 From: neo hong Date: Tue, 24 Aug 2021 17:14:44 +0800 Subject: [PATCH 153/341] support allow_tvm_london and allow_tvm_compatible_evm --- .../org/tron/core/actuator/VMActuator.java | 11 +- .../org/tron/core/utils/ProposalUtil.java | 16 +- .../main/java/org/tron/core/vm/OpCode.java | 4 + .../tron/core/vm/PrecompiledContracts.java | 80 ++++++ .../src/main/java/org/tron/core/vm/VM.java | 43 +-- .../org/tron/core/vm/program/Program.java | 28 +- .../tron/core/capsule/ContractCapsule.java | 4 + .../common/crypto/Blake2bfMessageDigest.java | 272 ++++++++++++++++++ .../java/org/tron/common/crypto/Hash.java | 16 ++ .../common/client/utils/PublicMethed.java | 4 + 10 files changed, 435 insertions(+), 43 deletions(-) create mode 100644 crypto/src/main/java/org/tron/common/crypto/Blake2bfMessageDigest.java diff --git a/actuator/src/main/java/org/tron/core/actuator/VMActuator.java b/actuator/src/main/java/org/tron/core/actuator/VMActuator.java index f8738ccd3ca..839c7f7ffb1 100644 --- a/actuator/src/main/java/org/tron/core/actuator/VMActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/VMActuator.java @@ -195,6 +195,15 @@ public void execute(Object object) throws ContractExeException { if (TrxType.TRX_CONTRACT_CREATION_TYPE == trxType && !result.isRevert()) { byte[] code = program.getResult().getHReturn(); + if (vmConfig.allowTvmLondon() && code[0] == (byte) 0xEF) { + // todo deal with exception + // throw new Program.BytecodeExecutionException("Contract creation error: code cannot " + // + "start with {}", "0xEF"); + if (null == result.getException()) { + result.setException(Program.Exception + .invalidOpCode((byte) 0xEF)); + } + } long saveCodeEnergy = (long) getLength(code) * EnergyCost.getInstance().getCREATE_DATA(); long afterSpend = program.getEnergyLimitLeft().longValue() - saveCodeEnergy; if (afterSpend < 0) { @@ -297,7 +306,7 @@ private void create() if (contract == null) { throw new ContractValidateException("Cannot get CreateSmartContract from transaction"); } - SmartContract newSmartContract = contract.getNewContract(); + SmartContract newSmartContract = contract.getNewContract().toBuilder().setVersion(1).build(); if (!contract.getOwnerAddress().equals(newSmartContract.getOriginAddress())) { logger.info("OwnerAddress not equals OriginAddress"); throw new ContractValidateException("OwnerAddress is not equals OriginAddress"); diff --git a/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java b/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java index bdb161d52ff..4b16b4c5286 100644 --- a/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java +++ b/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java @@ -471,10 +471,10 @@ public static void validator(DynamicPropertiesStore dynamicPropertiesStore, } case ALLOW_TVM_LONDON: { // todo version modify - if (!forkController.pass(ForkBlockVersionEnum.VERSION_4_3)) { - throw new ContractValidateException( - "Bad chain parameter id [ALLOW_TVM_LONDON]"); - } + // if (!forkController.pass(ForkBlockVersionEnum.VERSION_4_3)) { + // throw new ContractValidateException( + // "Bad chain parameter id [ALLOW_TVM_LONDON]"); + // } if (value != 1) { throw new ContractValidateException( "This value[ALLOW_TVM_LONDON] is only allowed to be 1"); @@ -483,10 +483,10 @@ public static void validator(DynamicPropertiesStore dynamicPropertiesStore, } case ALLOW_TVM_COMPATIBLE_EVM: { // todo version modify - if (!forkController.pass(ForkBlockVersionEnum.VERSION_4_3)) { - throw new ContractValidateException( - "Bad chain parameter id [ALLOW_TVM_COMPATIBLE_EVM]"); - } + // if (!forkController.pass(ForkBlockVersionEnum.VERSION_4_3)) { + // throw new ContractValidateException( + // "Bad chain parameter id [ALLOW_TVM_COMPATIBLE_EVM]"); + // } if (value != 1) { throw new ContractValidateException( "This value[ALLOW_TVM_COMPATIBLE_EVM] is only allowed to be 1"); diff --git a/actuator/src/main/java/org/tron/core/vm/OpCode.java b/actuator/src/main/java/org/tron/core/vm/OpCode.java index 5a0a41ac95c..31dc72fab28 100644 --- a/actuator/src/main/java/org/tron/core/vm/OpCode.java +++ b/actuator/src/main/java/org/tron/core/vm/OpCode.java @@ -244,6 +244,10 @@ public enum OpCode { * (0x47) Get current account balance */ SELFBALANCE(0x47, 0, 1, Tier.LowTier), + /** + * (0x48) Get block's basefee + */ + BASEFEE(0x48, 0, 1, Tier.BaseTier), /* Memory, Storage and Flow Operations */ diff --git a/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java b/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java index 01f5a414ab3..4e26445de18 100644 --- a/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java +++ b/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java @@ -24,8 +24,10 @@ import static org.tron.common.utils.BIUtil.isZero; import static org.tron.common.utils.ByteUtil.*; import static org.tron.core.db.TransactionTrace.convertToTronAddress; +import static java.util.Arrays.copyOfRange; import java.math.BigInteger; +import java.security.MessageDigest; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; @@ -45,6 +47,8 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.tuple.Pair; +import org.tron.common.crypto.Blake2bfMessageDigest; +import org.tron.common.crypto.Hash; import org.tron.common.crypto.SignUtils; import org.tron.common.crypto.SignatureInterface; import org.tron.common.crypto.zksnark.BN128; @@ -107,6 +111,9 @@ public class PrecompiledContracts { private static final ReceivedVoteCount receivedVoteCount = new ReceivedVoteCount(); private static final TotalVoteCount totalVoteCount = new TotalVoteCount(); + private static final EthRipemd160 ethRipemd160 = new EthRipemd160(); + private static final Blake2F blake2F = new Blake2F(); + private static final DataWord ecRecoverAddr = new DataWord( "0000000000000000000000000000000000000000000000000000000000000001"); private static final DataWord sha256Addr = new DataWord( @@ -147,6 +154,11 @@ public class PrecompiledContracts { "0000000000000000000000000000000000000000000000000000000001000009"); private static final DataWord totalVoteCountAddr = new DataWord( "000000000000000000000000000000000000000000000000000000000100000a"); + private static final DataWord ethRipemd160Addr = new DataWord( + "0000000000000000000000000000000000000000000000000000000000020003"); + private static final DataWord blake2FAddr = new DataWord( + "0000000000000000000000000000000000000000000000000000000000020009"); + public static PrecompiledContract getContractForAddress(DataWord address) { @@ -214,6 +226,12 @@ public static PrecompiledContract getContractForAddress(DataWord address) { if (VMConfig.allowTvmVote() && address.equals(totalVoteCountAddr)) { return totalVoteCount; } + if (VMConfig.allowTvmCompatibleEvm() && address.equals(ethRipemd160Addr)) { + return ethRipemd160; + } + if (VMConfig.allowTvmCompatibleEvm() && address.equals(blake2FAddr)) { + return blake2F; + } return null; } @@ -1721,4 +1739,66 @@ public Pair execute(byte[] data) { } } + public static class EthRipemd160 extends PrecompiledContract { + + + @Override + public long getEnergyForData(byte[] data) { + + if (data == null) { + return 600; + } + return 600L + (data.length + 31) / 32 * 120; + } + + @Override + public Pair execute(byte[] data) { + + byte[] result; + if (data == null) { + result = Hash.ripemd160(EMPTY_BYTE_ARRAY); + } else { + result = Hash.ripemd160(data); + } + return Pair.of(true, new DataWord(result).getData()); + } + } + + public static class Blake2F extends PrecompiledContract { + + + @Override + public long getEnergyForData(byte[] data) { + + if (data.length != 213 || (data[212] & 0xFE) != 0) { + return 0; + } + final byte[] roundsBytes = copyOfRange(data, 0, 4); + final BigInteger rounds = new BigInteger(1, roundsBytes); + return rounds.longValue(); + } + + @Override + public Pair execute(byte[] data) { + + if (data.length != 213) { + logger.info("Incorrect input length. Expected {} and got {}", 213, data.length); + return Pair.of(true, DataWord.ZERO().getData()); + } + if ((data[212] & 0xFE) != 0) { + logger.info("Incorrect finalization flag, expected 0 or 1 and got {}", data[212]); + return Pair.of(true, DataWord.ZERO().getData()); + } + final MessageDigest digest = new Blake2bfMessageDigest(); + byte[] result; + try { + digest.update(data); + result = digest.digest(); + } catch (Exception e) { + return Pair.of(true, new DataWord(EMPTY_BYTE_ARRAY).getData()); + } + return Pair.of(true, result); + } + } + } diff --git a/actuator/src/main/java/org/tron/core/vm/VM.java b/actuator/src/main/java/org/tron/core/vm/VM.java index 4df2b97d3d1..fc5e4a7d463 100644 --- a/actuator/src/main/java/org/tron/core/vm/VM.java +++ b/actuator/src/main/java/org/tron/core/vm/VM.java @@ -3,26 +3,7 @@ import static org.tron.common.crypto.Hash.sha3; import static org.tron.common.utils.ByteUtil.EMPTY_BYTE_ARRAY; import static org.tron.core.db.TransactionTrace.convertToTronAddress; -import static org.tron.core.vm.OpCode.CALL; -import static org.tron.core.vm.OpCode.CALLTOKEN; -import static org.tron.core.vm.OpCode.CALLTOKENID; -import static org.tron.core.vm.OpCode.CALLTOKENVALUE; -import static org.tron.core.vm.OpCode.CHAINID; -import static org.tron.core.vm.OpCode.CREATE2; -import static org.tron.core.vm.OpCode.EXTCODEHASH; -import static org.tron.core.vm.OpCode.FREEZE; -import static org.tron.core.vm.OpCode.FREEZEEXPIRETIME; -import static org.tron.core.vm.OpCode.ISCONTRACT; -import static org.tron.core.vm.OpCode.PUSH1; -import static org.tron.core.vm.OpCode.REVERT; -import static org.tron.core.vm.OpCode.SAR; -import static org.tron.core.vm.OpCode.SELFBALANCE; -import static org.tron.core.vm.OpCode.SHL; -import static org.tron.core.vm.OpCode.SHR; -import static org.tron.core.vm.OpCode.TOKENBALANCE; -import static org.tron.core.vm.OpCode.UNFREEZE; -import static org.tron.core.vm.OpCode.VOTEWITNESS; -import static org.tron.core.vm.OpCode.WITHDRAWREWARD; +import static org.tron.core.vm.OpCode.*; import java.math.BigInteger; import java.util.ArrayList; @@ -119,6 +100,8 @@ public void step(Program program) { && (op == FREEZE || op == UNFREEZE || op == FREEZEEXPIRETIME)) || (!VMConfig.allowTvmVote() && (op == VOTEWITNESS || op == WITHDRAWREWARD)) + || (!VMConfig.allowTvmLondon() + && (op == BASEFEE)) ) { throw Program.Exception.invalidOpCode(program.getCurrentOp()); } @@ -829,7 +812,10 @@ && isDeadAccount(program, callAddressWord) break; case GASPRICE: { DataWord energyPrice = new DataWord(0); - + if (program.getContractVersion() == 1) { + energyPrice = new DataWord(program.getContractState() + .getDynamicPropertiesStore().getEnergyFee()); + } program.stackPush(energyPrice); program.step(); } @@ -867,18 +853,19 @@ && isDeadAccount(program, callAddressWord) program.step(); } break; - case DIFFICULTY: { - DataWord difficulty = program.getDifficulty(); + case DIFFICULTY: + case GASLIMIT: { + DataWord result = new DataWord(0); - program.stackPush(difficulty); + program.stackPush(result); program.step(); } break; - case GASLIMIT: { - // todo: this energylimit is the block's energy limit - DataWord energyLimit = new DataWord(0); + case BASEFEE: { + DataWord energyFee = + new DataWord(program.getContractState().getDynamicPropertiesStore().getEnergyFee()); - program.stackPush(energyLimit); + program.stackPush(energyFee); program.step(); } break; diff --git a/actuator/src/main/java/org/tron/core/vm/program/Program.java b/actuator/src/main/java/org/tron/core/vm/program/Program.java index a1684401192..a6639a7c850 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/Program.java +++ b/actuator/src/main/java/org/tron/core/vm/program/Program.java @@ -136,6 +136,7 @@ public class Program { private boolean stopped; private ProgramPrecompile programPrecompile; + public Program(byte[] ops, ProgramInvoke programInvoke) { this(ops, programInvoke, null); } @@ -159,6 +160,8 @@ public Program(byte[] ops, ProgramInvoke programInvoke, InternalTransaction inte this.nonce = internalTransaction.getNonce(); } + + static String formatBinData(byte[] binData, int startPC) { StringBuilder ret = new StringBuilder(); for (int i = 0; i < binData.length; i += 16) { @@ -716,6 +719,9 @@ private void createContractImpl(DataWord value, byte[] programCode, byte[] newAd if (!contractAlreadyExists) { Builder builder = SmartContract.newBuilder(); + if (getContractVersion() == 1) { + builder.setVersion(1); + } builder.setContractAddress(ByteString.copyFrom(newAddress)) .setConsumeUserResourcePercent(100) .setOriginAddress(ByteString.copyFrom(senderAddress)); @@ -728,8 +734,12 @@ private void createContractImpl(DataWord value, byte[] programCode, byte[] newAd } else { deposit.createAccount(newAddress, "CreatedByContract", Protocol.AccountType.Contract); - SmartContract newSmartContract = SmartContract.newBuilder() - .setContractAddress(ByteString.copyFrom(newAddress)).setConsumeUserResourcePercent(100) + Builder builder = SmartContract.newBuilder(); + if (getContractVersion() == 1) { + builder.setVersion(1); + } + SmartContract newSmartContract = builder.setContractAddress(ByteString.copyFrom(newAddress)) + .setConsumeUserResourcePercent(100) .setOriginAddress(ByteString.copyFrom(senderAddress)).build(); deposit.createContract(newAddress, new ContractCapsule(newSmartContract)); // In case of hashing collisions, check for any balance before createAccount() @@ -1658,10 +1668,10 @@ public void checkTokenIdInTokenBalance(DataWord tokenIdDataWord) { } public DataWord getCallEnergy(OpCode op, DataWord requestedEnergy, DataWord availableEnergy) { - // todo version fork - if (VMConfig.allowTvmCompatibleEvm()) { - availableEnergy.div(new DataWord(intToBytes(64))); - availableEnergy.sub(availableEnergy); + if (getContractVersion() == 1) { + DataWord availableEnergyReduce = availableEnergy.clone(); + availableEnergyReduce.div(new DataWord(intToBytes(64))); + availableEnergy.sub(availableEnergyReduce); } return requestedEnergy.compareTo(availableEnergy) > 0 ? availableEnergy : requestedEnergy; } @@ -1963,6 +1973,12 @@ public long withdrawReward() { return 0; } + public int getContractVersion() { + byte [] contractAddress = + TransactionTrace.convertToTronAddress(getContractAddress().getLast20Bytes()); + return invoke.getDeposit().getContract(contractAddress).getContractVersion(); + } + /** * Denotes problem when executing Ethereum bytecode. From blockchain and peer perspective this is * quite normal situation and doesn't mean exceptional situation in terms of the program diff --git a/chainbase/src/main/java/org/tron/core/capsule/ContractCapsule.java b/chainbase/src/main/java/org/tron/core/capsule/ContractCapsule.java index 669e8c44dfb..2204b6446a3 100644 --- a/chainbase/src/main/java/org/tron/core/capsule/ContractCapsule.java +++ b/chainbase/src/main/java/org/tron/core/capsule/ContractCapsule.java @@ -129,4 +129,8 @@ public void clearABI() { public byte[] getTrxHash() { return this.smartContract.getTrxHash().toByteArray(); } + + public int getContractVersion() { + return this.smartContract.getVersion(); + } } diff --git a/crypto/src/main/java/org/tron/common/crypto/Blake2bfMessageDigest.java b/crypto/src/main/java/org/tron/common/crypto/Blake2bfMessageDigest.java new file mode 100644 index 00000000000..64073210493 --- /dev/null +++ b/crypto/src/main/java/org/tron/common/crypto/Blake2bfMessageDigest.java @@ -0,0 +1,272 @@ +package org.tron.common.crypto; + +import static java.util.Arrays.copyOfRange; + +import org.bouncycastle.crypto.Digest; +import org.bouncycastle.jcajce.provider.digest.BCMessageDigest; +import org.bouncycastle.util.Arrays; +import org.bouncycastle.util.Pack; + +public class Blake2bfMessageDigest extends BCMessageDigest implements Cloneable { + + public Blake2bfMessageDigest() { + super(new Blake2bfDigest()); + } + + /** + * Implementation of the `F` compression function of the Blake2b cryptographic hash function. + * + *

RFC - https://tools.ietf.org/html/rfc7693 + * + *

Adapted from - https://github.com/keep-network/blake2b/blob/master/compression/f.go + * + *

Optimized for 64-bit platforms + */ + public static class Blake2bfDigest implements Digest { + + public static final int MESSAGE_LENGTH_BYTES = 213; + + private static final long[] IV = { + 0x6a09e667f3bcc908L, 0xbb67ae8584caa73bL, 0x3c6ef372fe94f82bL, + 0xa54ff53a5f1d36f1L, 0x510e527fade682d1L, 0x9b05688c2b3e6c1fL, + 0x1f83d9abfb41bd6bL, 0x5be0cd19137e2179L + }; + + private static final byte[][] PRECOMPUTED = { + {0, 2, 4, 6, 1, 3, 5, 7, 8, 10, 12, 14, 9, 11, 13, 15}, + {14, 4, 9, 13, 10, 8, 15, 6, 1, 0, 11, 5, 12, 2, 7, 3}, + {11, 12, 5, 15, 8, 0, 2, 13, 10, 3, 7, 9, 14, 6, 1, 4}, + {7, 3, 13, 11, 9, 1, 12, 14, 2, 5, 4, 15, 6, 10, 0, 8}, + {9, 5, 2, 10, 0, 7, 4, 15, 14, 11, 6, 3, 1, 12, 8, 13}, + {2, 6, 0, 8, 12, 10, 11, 3, 4, 7, 15, 1, 13, 5, 14, 9}, + {12, 1, 14, 4, 5, 15, 13, 10, 0, 6, 9, 8, 7, 3, 2, 11}, + {13, 7, 12, 3, 11, 14, 1, 9, 5, 15, 8, 2, 0, 4, 6, 10}, + {6, 14, 11, 0, 15, 9, 3, 8, 12, 13, 1, 10, 2, 7, 4, 5}, + {10, 8, 7, 1, 2, 4, 6, 5, 15, 9, 3, 13, 11, 14, 12, 0} + }; + + private static final int DIGEST_LENGTH = 64; + + // buffer which holds serialized input for this compression function + // [ 4 bytes for rounds ][ 64 bytes for h ][ 128 bytes for m ] + // [ 8 bytes for t_0 ][ 8 bytes for t_1 ][ 1 byte for f ] + private final byte[] buffer; + + private int bufferPos; + + // deserialized inputs for f compression + private final long[] h; + private final long[] m; + private final long[] t; + private boolean f; + private long rounds; // unsigned integer represented as long + + private final long[] v; + + Blake2bfDigest() { + buffer = new byte[MESSAGE_LENGTH_BYTES]; + bufferPos = 0; + + h = new long[8]; + m = new long[16]; + t = new long[2]; + f = false; + rounds = 12; + + v = new long[16]; + } + + // for tests + Blake2bfDigest( + final long[] h, final long[] m, final long[] t, final boolean f, final long rounds) { + assert rounds <= 4294967295L; // uint max value + buffer = new byte[MESSAGE_LENGTH_BYTES]; + bufferPos = 0; + + this.h = h; + this.m = m; + this.t = t; + this.f = f; + this.rounds = rounds; + + v = new long[16]; + } + + @Override + public String getAlgorithmName() { + return "BLAKE2f"; + } + + @Override + public int getDigestSize() { + return DIGEST_LENGTH; + } + + /** + * update the message digest with a single byte. + * + * @param in the input byte to be entered. + */ + @Override + public void update(final byte in) { + + if (bufferPos == MESSAGE_LENGTH_BYTES) { // full buffer + throw new IllegalArgumentException(); + } else { + buffer[bufferPos] = in; + bufferPos++; + if (bufferPos == MESSAGE_LENGTH_BYTES) { + initialize(); + } + } + } + + /** + * update the message digest with a block of bytes. + * + * @param in the byte array containing the data. + * @param offset the offset into the byte array where the data starts. + * @param len the length of the data. + */ + @Override + public void update(final byte[] in, final int offset, final int len) { + if (in == null || len == 0) { + return; + } + + if (len > MESSAGE_LENGTH_BYTES - bufferPos) { + throw new IllegalArgumentException( + "Attempting to update buffer with " + + len + + " byte(s) but there is " + + (MESSAGE_LENGTH_BYTES - bufferPos) + + " byte(s) left to fill"); + } + + System.arraycopy(in, offset, buffer, bufferPos, len); + + bufferPos += len; + + if (bufferPos == MESSAGE_LENGTH_BYTES) { + initialize(); + } + } + + /** + * close the digest, producing the final digest value. The doFinal call leaves the digest reset. + * + * @param out the array the digest is to be copied into. + * @param offset the offset into the out array the digest is to start at. + */ + @Override + public int doFinal(final byte[] out, final int offset) { + if (bufferPos != 213) { + throw new IllegalStateException("The buffer must be filled with 213 bytes"); + } + + compress(); + + for (int i = 0; i < h.length; i++) { + System.arraycopy(Pack.longToLittleEndian(h[i]), 0, out, i * 8, 8); + } + + reset(); + + return 0; + } + + /** Reset the digest back to it's initial state. */ + @Override + public void reset() { + bufferPos = 0; + Arrays.fill(buffer, (byte) 0); + Arrays.fill(h, 0); + Arrays.fill(m, (byte) 0); + Arrays.fill(t, 0); + f = false; + rounds = 12; + Arrays.fill(v, 0); + } + + private void initialize() { + rounds = Integer.toUnsignedLong(bytesToInt(copyOfRange(buffer, 0, 4))); + + for (int i = 0; i < h.length; i++) { + final int offset = 4 + i * 8; + h[i] = bytesToLong((copyOfRange(buffer, offset, offset + 8))); + } + + for (int i = 0; i < 16; i++) { + final int offset = 68 + i * 8; + m[i] = bytesToLong(copyOfRange(buffer, offset, offset + 8)); + } + + t[0] = bytesToLong(copyOfRange(buffer, 196, 204)); + t[1] = bytesToLong(copyOfRange(buffer, 204, 212)); + + f = buffer[212] != 0; + } + + private int bytesToInt(final byte[] bytes) { + return Pack.bigEndianToInt(bytes, 0); + } + + private long bytesToLong(final byte[] bytes) { + return Pack.littleEndianToLong(bytes, 0); + } + + /** + * F is a compression function for BLAKE2b. It takes as an argument the state vector `h`, + * message block vector `m`, offset counter `t`, final block indicator flag `f`, and number of + * rounds `rounds`. The state vector provided as the first parameter is modified by the + * function. + */ + private void compress() { + + long t0 = t[0]; + long t1 = t[1]; + + System.arraycopy(h, 0, v, 0, 8); + System.arraycopy(IV, 0, v, 8, 8); + + v[12] ^= t0; + v[13] ^= t1; + + if (f) { + v[14] ^= 0xffffffffffffffffL; + } + + for (long j = 0; j < rounds; ++j) { + byte[] s = PRECOMPUTED[(int) (j % 10)]; + + mix(m[s[0]], m[s[4]], 0, 4, 8, 12); + mix(m[s[1]], m[s[5]], 1, 5, 9, 13); + mix(m[s[2]], m[s[6]], 2, 6, 10, 14); + mix(m[s[3]], m[s[7]], 3, 7, 11, 15); + mix(m[s[8]], m[s[12]], 0, 5, 10, 15); + mix(m[s[9]], m[s[13]], 1, 6, 11, 12); + mix(m[s[10]], m[s[14]], 2, 7, 8, 13); + mix(m[s[11]], m[s[15]], 3, 4, 9, 14); + } + + // update h: + for (int offset = 0; offset < h.length; offset++) { + h[offset] ^= v[offset] ^ v[offset + 8]; + } + } + + private void mix( + final long a, final long b, final int i, final int j, final int k, final int l) { + v[i] += a + v[j]; + v[l] = Long.rotateLeft(v[l] ^ v[i], -32); + v[k] += v[l]; + v[j] = Long.rotateLeft(v[j] ^ v[k], -24); + + v[i] += b + v[j]; + v[l] = Long.rotateLeft(v[l] ^ v[i], -16); + v[k] += v[l]; + v[j] = Long.rotateLeft(v[j] ^ v[k], -63); + } + } +} + diff --git a/crypto/src/main/java/org/tron/common/crypto/Hash.java b/crypto/src/main/java/org/tron/common/crypto/Hash.java index a4cb07ce65d..eca769a8dad 100644 --- a/crypto/src/main/java/org/tron/common/crypto/Hash.java +++ b/crypto/src/main/java/org/tron/common/crypto/Hash.java @@ -32,6 +32,8 @@ import org.bouncycastle.math.ec.ECPoint; import org.tron.common.crypto.jce.TronCastleProvider; import org.tron.common.utils.DecodeUtil; +import org.bouncycastle.crypto.Digest; +import org.bouncycastle.crypto.digests.RIPEMD160Digest; @Slf4j(topic = "crypto") public class Hash { @@ -195,4 +197,18 @@ public static byte[] sha3omit12(byte[] input) { address[0] = DecodeUtil.addressPreFixByte; return address; } + + /** @param data - message to hash + * + * @return - ripemd160 hash of the message + */ + public static byte[] ripemd160(byte[] data) { + Digest digest = new RIPEMD160Digest(); + + byte[] resBuf = new byte[digest.getDigestSize()]; + digest.update(data, 0, data.length); + digest.doFinal(resBuf, 0); + return resBuf; + } + } diff --git a/framework/src/test/java/stest/tron/wallet/common/client/utils/PublicMethed.java b/framework/src/test/java/stest/tron/wallet/common/client/utils/PublicMethed.java index fe7ceda6758..b1a8053f12c 100644 --- a/framework/src/test/java/stest/tron/wallet/common/client/utils/PublicMethed.java +++ b/framework/src/test/java/stest/tron/wallet/common/client/utils/PublicMethed.java @@ -76,6 +76,7 @@ import org.tron.common.utils.Commons; import org.tron.core.Wallet; import org.tron.core.capsule.BlockCapsule.BlockId; +import org.tron.core.vm.config.VMConfig; import org.tron.core.zen.address.DiversifierT; import org.tron.core.zen.address.ExpandedSpendingKey; import org.tron.core.zen.address.FullViewingKey; @@ -2598,6 +2599,9 @@ public static byte[] deployContract(String contractName, String abiString, Strin byteCode = Hex.decode(code); } builder.setBytecode(ByteString.copyFrom(byteCode)); + if (VMConfig.allowTvmCompatibleEvm()) { + builder.setVersion(1); + } Builder contractBuilder = CreateSmartContract.newBuilder(); contractBuilder.setOwnerAddress(ByteString.copyFrom(owner)); From 37485e9ef527034148d26b6f4a562e9a67bffb2f Mon Sep 17 00:00:00 2001 From: Asuka Date: Tue, 24 Aug 2021 17:22:40 +0800 Subject: [PATCH 154/341] feature: change ENERGY_LIMIT_IN_CONSTANT_TX to config parameter - Set to 1e8 by default if no config - Set to config parameter if greater than upper limit 3e6 --- .../src/main/java/org/tron/core/actuator/VMActuator.java | 2 +- .../main/java/org/tron/common/parameter/CommonParameter.java | 4 ++++ common/src/main/java/org/tron/core/Constant.java | 1 + framework/src/main/java/org/tron/core/config/args/Args.java | 5 +++++ framework/src/main/resources/config.conf | 1 + 5 files changed, 12 insertions(+), 1 deletion(-) diff --git a/actuator/src/main/java/org/tron/core/actuator/VMActuator.java b/actuator/src/main/java/org/tron/core/actuator/VMActuator.java index 7d777329005..0586da961db 100644 --- a/actuator/src/main/java/org/tron/core/actuator/VMActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/VMActuator.java @@ -451,7 +451,7 @@ private void call() AccountCapsule caller = repository.getAccount(callerAddress); long energyLimit; if (isConstantCall) { - energyLimit = VMConstant.ENERGY_LIMIT_IN_CONSTANT_TX; + energyLimit = CommonParameter.getInstance().maxEnergyLimitForConstant; } else { AccountCapsule creator = repository .getAccount(deployedContract.getInstance().getOriginAddress().toByteArray()); diff --git a/common/src/main/java/org/tron/common/parameter/CommonParameter.java b/common/src/main/java/org/tron/common/parameter/CommonParameter.java index 7529a256480..c2b136c311e 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -45,6 +45,10 @@ public class CommonParameter { public boolean supportConstant = false; @Getter @Setter + @Parameter(names = {"--max-energy-limit-for-constant"}) + public long maxEnergyLimitForConstant = 100_000_000L; + @Getter + @Setter @Parameter(names = {"--debug"}) public boolean debug = false; @Getter diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index 00c7f440dce..b70ace41a88 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -60,6 +60,7 @@ public class Constant { public static final String LOCAL_WITNESS_ACCOUNT_ADDRESS = "localWitnessAccountAddress"; public static final String LOCAL_WITNESS_KEYSTORE = "localwitnesskeystore"; public static final String VM_SUPPORT_CONSTANT = "vm.supportConstant"; + public static final String VM_MAX_ENERGY_LIMIT_FOR_CONSTANT = "vm.maxEnergyLimitForConstant"; public static final String VM_MIN_TIME_RATIO = "vm.minTimeRatio"; public static final String VM_MAX_TIME_RATIO = "vm.maxTimeRatio"; public static final String VM_LONG_RUNNING_TIME = "vm.longRunningTime"; diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index b95c623fb46..154f4d50ab9 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -284,6 +284,11 @@ public static void setParam(final String[] args, final String confFileName) { PARAMETER.supportConstant = config.getBoolean(Constant.VM_SUPPORT_CONSTANT); } + if (config.hasPath(Constant.VM_MAX_ENERGY_LIMIT_FOR_CONSTANT)) { + long configLimit = config.getLong(Constant.VM_MAX_ENERGY_LIMIT_FOR_CONSTANT); + PARAMETER.maxEnergyLimitForConstant = max(3_000_000L, configLimit); + } + if (config.hasPath(Constant.NODE_HTTP_FULLNODE_ENABLE)) { PARAMETER.fullNodeHttpEnable = config.getBoolean(Constant.NODE_HTTP_FULLNODE_ENABLE); } diff --git a/framework/src/main/resources/config.conf b/framework/src/main/resources/config.conf index 2326876f17c..b40dfe0e2b1 100644 --- a/framework/src/main/resources/config.conf +++ b/framework/src/main/resources/config.conf @@ -508,6 +508,7 @@ block = { vm = { supportConstant = false + maxEnergyLimitForConstant = 100000000 minTimeRatio = 0.0 maxTimeRatio = 5.0 saveInternalTx = false From 5da6f6b790a596c2f00c0bd82ac1d5d754e8e188 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Tue, 24 Aug 2021 19:19:11 +0800 Subject: [PATCH 155/341] feat: add disabledApi to config --- .../common/parameter/CommonParameter.java | 4 +++ .../src/main/java/org/tron/core/Constant.java | 2 ++ .../java/org/tron/core/config/args/Args.java | 7 +++++ .../org/tron/core/services/RpcApiService.java | 6 ++-- .../services/filter/HttpApiAccessFilter.java | 28 +++++++++++++---- .../services/http/FullNodeHttpApiService.java | 2 +- .../solidity/SolidityNodeHttpApiService.java | 2 +- .../interfaceOnPBFT/RpcApiServiceOnPBFT.java | 6 ++-- .../RpcApiServiceOnSolidity.java | 6 ++-- .../solidity/HttpApiOnSolidityService.java | 2 +- .../ratelimiter/RpcApiAccessInterceptor.java | 31 +++++++++++++++---- framework/src/main/resources/config.conf | 8 +++++ 12 files changed, 80 insertions(+), 24 deletions(-) diff --git a/common/src/main/java/org/tron/common/parameter/CommonParameter.java b/common/src/main/java/org/tron/common/parameter/CommonParameter.java index afdddf306e0..a58174e32b4 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -476,6 +476,10 @@ public class CommonParameter { @Setter public long allowAccountAssetOptimization; + @Getter + @Setter + public List disabledApiList; + private static double calcMaxTimeRatio() { //return max(2.0, min(5.0, 5 * 4.0 / max(Runtime.getRuntime().availableProcessors(), 1))); return 5.0; diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index 890be85e2a0..cbc57c0df44 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -95,6 +95,8 @@ public class Constant { public static final String NODE_HTTP_SOLIDITY_ENABLE = "node.http.solidityEnable"; public static final String NODE_HTTP_PBFT_PORT = "node.http.PBFTPort"; + public static final String NODE_DISABLED_API_LIST = "node.disabledApi"; + public static final String NODE_RPC_THREAD = "node.rpc.thread"; public static final String NODE_SOLIDITY_THREADS = "node.solidity.threads"; diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index d159f1ad243..6533bb1356b 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -189,6 +189,7 @@ public static void clearParam() { PARAMETER.openPrintLog = true; PARAMETER.openTransactionSort = false; PARAMETER.allowAccountAssetOptimization = 0; + PARAMETER.disabledApiList = Collections.emptyList(); } /** @@ -762,6 +763,12 @@ public static void setParam(final String[] args, final String confFileName) { .hasPath(Constant.ALLOW_ACCOUNT_ASSET_OPTIMIZATION) ? config .getInt(Constant.ALLOW_ACCOUNT_ASSET_OPTIMIZATION) : 0; + PARAMETER.disabledApiList = + config.hasPath(Constant.NODE_DISABLED_API_LIST) + ? config.getStringList(Constant.NODE_DISABLED_API_LIST) + .stream().map(String::toLowerCase).collect(Collectors.toList()) + : Collections.emptyList(); + logConfig(); } diff --git a/framework/src/main/java/org/tron/core/services/RpcApiService.java b/framework/src/main/java/org/tron/core/services/RpcApiService.java index 004df06c245..e75c066addf 100755 --- a/framework/src/main/java/org/tron/core/services/RpcApiService.java +++ b/framework/src/main/java/org/tron/core/services/RpcApiService.java @@ -261,12 +261,12 @@ public void start() { // add a rate limiter interceptor serverBuilder.intercept(rateLimiterInterceptor); - // add lite fullnode query interceptor - serverBuilder.intercept(liteFnQueryGrpcInterceptor); - // add api access interceptor, this should have highest priority serverBuilder.intercept(apiAccessInterceptor); + // add lite fullnode query interceptor + serverBuilder.intercept(liteFnQueryGrpcInterceptor); + apiServer = serverBuilder.build(); rateLimiterInterceptor.init(apiServer); diff --git a/framework/src/main/java/org/tron/core/services/filter/HttpApiAccessFilter.java b/framework/src/main/java/org/tron/core/services/filter/HttpApiAccessFilter.java index d3188c68c21..35ebd9d6d6d 100644 --- a/framework/src/main/java/org/tron/core/services/filter/HttpApiAccessFilter.java +++ b/framework/src/main/java/org/tron/core/services/filter/HttpApiAccessFilter.java @@ -1,6 +1,7 @@ package org.tron.core.services.filter; import com.alibaba.fastjson.JSONObject; +import java.util.List; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -10,13 +11,12 @@ import javax.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import org.tron.common.parameter.CommonParameter; @Component -@Slf4j(topic = "httpAccessFilter") +@Slf4j(topic = "httpApiAccessFilter") public class HttpApiAccessFilter implements Filter { - private String endpoint; - @Override public void init(FilterConfig filterConfig) { } @@ -25,13 +25,14 @@ public void init(FilterConfig filterConfig) { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { try { if (request instanceof HttpServletRequest) { - endpoint = ((HttpServletRequest) request).getRequestURI(); + String endpoint = ((HttpServletRequest) request).getRequestURI(); HttpServletResponse resp = (HttpServletResponse) response; - if (endpoint.split("/")[2].equals("getnowblock")) { + if (isDisabled(endpoint)) { resp.setStatus(HttpServletResponse.SC_NOT_FOUND); + resp.setContentType("application/json; charset=utf-8"); JSONObject jsonObject = new JSONObject(); - jsonObject.put("Error", "The requested resource is not available due to config"); + jsonObject.put("Error", "this API is unavailable due to config"); resp.getWriter().println(jsonObject.toJSONString()); return; } @@ -53,6 +54,21 @@ public void destroy() { } + private boolean isDisabled(String endpoint) { + boolean disabled = false; + + try { + List disabledApiList = CommonParameter.getInstance().getDisabledApiList(); + if (!disabledApiList.isEmpty()) { + disabled = disabledApiList.contains(endpoint.split("/")[2].toLowerCase()); + } + } catch (Exception e) { + logger.error("check isDisabled except, endpoint={}, error is {}", endpoint, e.getMessage()); + } + + return disabled; + } + } diff --git a/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java b/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java index b561bfb0cc7..d181fdc7bcc 100644 --- a/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java +++ b/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java @@ -544,7 +544,7 @@ public void start() { EnumSet.allOf(DispatcherType.class)); // http access filter, it should have high priority than HttpInterceptor - context.addFilter(new FilterHolder(httpApiAccessFilter), "/*", + context.addFilter(new FilterHolder(httpApiAccessFilter), "/wallet/*", EnumSet.allOf(DispatcherType.class)); // filter diff --git a/framework/src/main/java/org/tron/core/services/http/solidity/SolidityNodeHttpApiService.java b/framework/src/main/java/org/tron/core/services/http/solidity/SolidityNodeHttpApiService.java index 896b274c7c9..ea141dd6a55 100644 --- a/framework/src/main/java/org/tron/core/services/http/solidity/SolidityNodeHttpApiService.java +++ b/framework/src/main/java/org/tron/core/services/http/solidity/SolidityNodeHttpApiService.java @@ -251,7 +251,7 @@ public void start() { context.addServlet(new ServletHolder(getBurnTrxServlet), "/walletsolidity/getburntrx"); // http access filter - context.addFilter(new FilterHolder(httpApiAccessFilter), "/*", + context.addFilter(new FilterHolder(httpApiAccessFilter), "/walletsolidity/*", EnumSet.allOf(DispatcherType.class)); int maxHttpConnectNumber = Args.getInstance().getMaxHttpConnectNumber(); diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java index 289cfda1fd9..d358504dd58 100755 --- a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java @@ -115,12 +115,12 @@ public void start() { // add a ratelimiter interceptor serverBuilder.intercept(rateLimiterInterceptor); - // add lite fullnode query interceptor - serverBuilder.intercept(liteFnQueryGrpcInterceptor); - // add api access interceptor, this should have highest priority serverBuilder.intercept(apiAccessInterceptor); + // add lite fullnode query interceptor + serverBuilder.intercept(liteFnQueryGrpcInterceptor); + apiServer = serverBuilder.build(); rateLimiterInterceptor.init(apiServer); diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java index a5b83fab2e6..8e630a2cd4f 100755 --- a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java @@ -115,12 +115,12 @@ public void start() { // add a ratelimiter interceptor serverBuilder.intercept(rateLimiterInterceptor); - // add lite fullnode query interceptor - serverBuilder.intercept(liteFnQueryGrpcInterceptor); - // add api access interceptor, this should have highest priority serverBuilder.intercept(apiAccessInterceptor); + // add lite fullnode query interceptor + serverBuilder.intercept(liteFnQueryGrpcInterceptor); + apiServer = serverBuilder.build(); rateLimiterInterceptor.init(apiServer); diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java index 143fa4171e3..c17d871409b 100644 --- a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java @@ -257,7 +257,7 @@ public void start() { EnumSet.allOf(DispatcherType.class)); // api access filter - context.addFilter(new FilterHolder(httpApiAccessFilter), "/*", + context.addFilter(new FilterHolder(httpApiAccessFilter), "/walletsolidity/*", EnumSet.allOf(DispatcherType.class)); int maxHttpConnectNumber = Args.getInstance().getMaxHttpConnectNumber(); diff --git a/framework/src/main/java/org/tron/core/services/ratelimiter/RpcApiAccessInterceptor.java b/framework/src/main/java/org/tron/core/services/ratelimiter/RpcApiAccessInterceptor.java index a6a4ed5da29..c3471c2829c 100644 --- a/framework/src/main/java/org/tron/core/services/ratelimiter/RpcApiAccessInterceptor.java +++ b/framework/src/main/java/org/tron/core/services/ratelimiter/RpcApiAccessInterceptor.java @@ -6,30 +6,49 @@ import io.grpc.ServerCallHandler; import io.grpc.ServerInterceptor; import io.grpc.Status; -import io.grpc.Status.Code; +import java.util.List; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import org.tron.common.parameter.CommonParameter; @Slf4j @Component public class RpcApiAccessInterceptor implements ServerInterceptor { @Override - public Listener interceptCall(ServerCall call, Metadata headers, + public Listener interceptCall(ServerCall call, + Metadata headers, ServerCallHandler next) { - String fullMethodName = call.getMethodDescriptor().getFullMethodName(); + String endpoint = call.getMethodDescriptor().getFullMethodName(); try { - if (fullMethodName.split("/")[1].toLowerCase().equals("getnowblock2")) { - call.close(Status.fromCode(Code.NOT_FOUND), new Metadata()); + if (isDisabled(endpoint)) { + call.close(Status.UNAVAILABLE + .withDescription("this API is unavailable due to config"), headers); return new ServerCall.Listener() {}; + } else { return next.startCall(call, headers); } } catch (Exception e) { - logger.error("Rpc Api Error: {}", e.getMessage()); + logger.error("check rpc api access Error: {}", e.getMessage()); return next.startCall(call, headers); } } + + private boolean isDisabled(String endpoint) { + boolean disabled = false; + + try { + List disabledApiList = CommonParameter.getInstance().getDisabledApiList(); + if (!disabledApiList.isEmpty()) { + disabled = disabledApiList.contains(endpoint.split("/")[1].toLowerCase()); + } + } catch (Exception e) { + logger.error("check isDisabled except, endpoint={}, error is {}", endpoint, e.getMessage()); + } + + return disabled; + } } \ No newline at end of file diff --git a/framework/src/main/resources/config.conf b/framework/src/main/resources/config.conf index 2326876f17c..d09fa96116a 100644 --- a/framework/src/main/resources/config.conf +++ b/framework/src/main/resources/config.conf @@ -216,6 +216,14 @@ node { # note: above APIs may return null even if blocks and transactions actually are on the blockchain # when opening on a lite fullnode. only open it if the consequences being clearly known # openHistoryQueryWhenLiteFN = false + + # disabled api list, it will work for http, rpc and pbft, both fullnode and soliditynode, + # but not jsonrpc. + # The setting is case insensitive, GetNowBlock2 is equal to getnowblock2 + # disabledApi = [ + # "getaccount", + # "getnowblock2" + # ] } ## rate limiter config From 5d9627434916d64830fd73e366b95478c690aba9 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 25 Aug 2021 14:59:59 +0800 Subject: [PATCH 156/341] feat: set pathSpecs for http api access filter --- .../java/org/tron/core/services/RpcApiService.java | 4 ++-- .../core/services/http/FullNodeHttpApiService.java | 12 +++++++++--- .../http/solidity/SolidityNodeHttpApiService.java | 4 ++++ .../interfaceOnPBFT/RpcApiServiceOnPBFT.java | 2 +- .../interfaceOnSolidity/RpcApiServiceOnSolidity.java | 2 +- .../http/solidity/HttpApiOnSolidityService.java | 4 ++++ 6 files changed, 21 insertions(+), 7 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/RpcApiService.java b/framework/src/main/java/org/tron/core/services/RpcApiService.java index e75c066addf..9c7fe772679 100755 --- a/framework/src/main/java/org/tron/core/services/RpcApiService.java +++ b/framework/src/main/java/org/tron/core/services/RpcApiService.java @@ -255,13 +255,13 @@ public void start() { .flowControlWindow(parameter.getFlowControlWindow()) .maxConnectionIdle(parameter.getMaxConnectionIdleInMillis(), TimeUnit.MILLISECONDS) .maxConnectionAge(parameter.getMaxConnectionAgeInMillis(), TimeUnit.MILLISECONDS) - .maxMessageSize(parameter.getMaxMessageSize()) + .maxInboundMessageSize(parameter.getMaxMessageSize()) .maxHeaderListSize(parameter.getMaxHeaderListSize()); // add a rate limiter interceptor serverBuilder.intercept(rateLimiterInterceptor); - // add api access interceptor, this should have highest priority + // add api access interceptor serverBuilder.intercept(apiAccessInterceptor); // add lite fullnode query interceptor diff --git a/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java b/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java index d181fdc7bcc..0af821f972d 100644 --- a/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java +++ b/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java @@ -543,11 +543,17 @@ public void start() { context.addFilter(new FilterHolder(liteFnQueryHttpFilter), "/*", EnumSet.allOf(DispatcherType.class)); - // http access filter, it should have high priority than HttpInterceptor - context.addFilter(new FilterHolder(httpApiAccessFilter), "/wallet/*", + // http access filter, it should have higher priority than HttpInterceptor + context.addFilter(new FilterHolder(httpApiAccessFilter), "/*", EnumSet.allOf(DispatcherType.class)); + // note: if the pathSpec of servlet is not started with wallet, it should be included here + context.getServletHandler().getFilterMappings()[1] + .setPathSpecs(new String[] {"/wallet/*", + "/net/listnodes", + "/monitor/getstatsinfo", + "/monitor/getnodeinfo"}); - // filter + // metrics filter ServletHandler handler = new ServletHandler(); FilterHolder fh = handler .addFilterWithMapping((Class) HttpInterceptor.class, "/*", diff --git a/framework/src/main/java/org/tron/core/services/http/solidity/SolidityNodeHttpApiService.java b/framework/src/main/java/org/tron/core/services/http/solidity/SolidityNodeHttpApiService.java index ea141dd6a55..6210f542370 100644 --- a/framework/src/main/java/org/tron/core/services/http/solidity/SolidityNodeHttpApiService.java +++ b/framework/src/main/java/org/tron/core/services/http/solidity/SolidityNodeHttpApiService.java @@ -246,6 +246,7 @@ public void start() { "/walletsolidity/triggerconstantcontract"); context.addServlet(new ServletHolder(getNodeInfoServlet), "/wallet/getnodeinfo"); + context.addServlet(new ServletHolder(getNodeInfoServlet), "/walletsolidity/getnodeinfo"); context.addServlet(new ServletHolder(getBrokerageServlet), "/walletsolidity/getBrokerage"); context.addServlet(new ServletHolder(getRewardServlet), "/walletsolidity/getReward"); context.addServlet(new ServletHolder(getBurnTrxServlet), "/walletsolidity/getburntrx"); @@ -253,6 +254,9 @@ public void start() { // http access filter context.addFilter(new FilterHolder(httpApiAccessFilter), "/walletsolidity/*", EnumSet.allOf(DispatcherType.class)); + context.getServletHandler().getFilterMappings()[0] + .setPathSpecs(new String[] {"/walletsolidity/*", + "/wallet/getnodeinfo"}); int maxHttpConnectNumber = Args.getInstance().getMaxHttpConnectNumber(); if (maxHttpConnectNumber > 0) { diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java index d358504dd58..01a06b4eb34 100755 --- a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java @@ -115,7 +115,7 @@ public void start() { // add a ratelimiter interceptor serverBuilder.intercept(rateLimiterInterceptor); - // add api access interceptor, this should have highest priority + // add api access interceptor serverBuilder.intercept(apiAccessInterceptor); // add lite fullnode query interceptor diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java index 8e630a2cd4f..71438de0670 100755 --- a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java @@ -115,7 +115,7 @@ public void start() { // add a ratelimiter interceptor serverBuilder.intercept(rateLimiterInterceptor); - // add api access interceptor, this should have highest priority + // add api access interceptor serverBuilder.intercept(apiAccessInterceptor); // add lite fullnode query interceptor diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java index c17d871409b..8892e8d6c92 100644 --- a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java @@ -246,6 +246,7 @@ public void start() { "/walletsolidity/gettransactioncountbyblocknum"); context.addServlet(new ServletHolder(getNodeInfoOnSolidityServlet), "/wallet/getnodeinfo"); + context.addServlet(new ServletHolder(getNodeInfoOnSolidityServlet), "/walletsolidity/getnodeinfo"); context.addServlet(new ServletHolder(getBrokerageServlet), "/walletsolidity/getBrokerage"); context.addServlet(new ServletHolder(getRewardServlet), "/walletsolidity/getReward"); context @@ -259,6 +260,9 @@ public void start() { // api access filter context.addFilter(new FilterHolder(httpApiAccessFilter), "/walletsolidity/*", EnumSet.allOf(DispatcherType.class)); + context.getServletHandler().getFilterMappings()[1] + .setPathSpecs(new String[] {"/walletsolidity/*", + "/wallet/getnodeinfo"}); int maxHttpConnectNumber = Args.getInstance().getMaxHttpConnectNumber(); if (maxHttpConnectNumber > 0) { From 0e4a6420b4e1b46a2f5d8324a3a7fbcaf92778c2 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 25 Aug 2021 15:19:55 +0800 Subject: [PATCH 157/341] feat: set content-type to application/json; charset=utf-8 --- .../org/tron/core/services/filter/LiteFnQueryHttpFilter.java | 1 + .../java/org/tron/core/services/http/RateLimiterServlet.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/framework/src/main/java/org/tron/core/services/filter/LiteFnQueryHttpFilter.java b/framework/src/main/java/org/tron/core/services/filter/LiteFnQueryHttpFilter.java index e80ce4ec549..b7afdbb4258 100644 --- a/framework/src/main/java/org/tron/core/services/filter/LiteFnQueryHttpFilter.java +++ b/framework/src/main/java/org/tron/core/services/filter/LiteFnQueryHttpFilter.java @@ -113,6 +113,7 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo shouldBeFiltered = true; } if (shouldBeFiltered) { + servletResponse.setContentType("application/json; charset=utf-8"); servletResponse.getWriter().write("this API is closed because this node is a lite fullnode"); } else { filterChain.doFilter(servletRequest, servletResponse); diff --git a/framework/src/main/java/org/tron/core/services/http/RateLimiterServlet.java b/framework/src/main/java/org/tron/core/services/http/RateLimiterServlet.java index 8fa47fd60eb..e0f65fa09ba 100644 --- a/framework/src/main/java/org/tron/core/services/http/RateLimiterServlet.java +++ b/framework/src/main/java/org/tron/core/services/http/RateLimiterServlet.java @@ -95,6 +95,8 @@ protected void service(HttpServletRequest req, HttpServletResponse resp) } try { + resp.setContentType("application/json; charset=utf-8"); + if (acquireResource) { super.service(req, resp); } else { From 2f4dfd3a15a7da58906767eb6378452cf30f924b Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 25 Aug 2021 22:01:50 +0800 Subject: [PATCH 158/341] feat: use JsonRpcMethodNotFoundException instead of runtime exception, get transactionResult from transaction if no transactioninfo --- .../org/tron/core/db/TransactionStore.java | 12 +- .../JsonRpcMethodNotFoundException.java | 16 ++ .../core/services/jsonrpc/JsonRpcApiUtil.java | 6 +- .../services/jsonrpc/TransactionResult.java | 53 ++++++- .../core/services/jsonrpc/TronJsonRpc.java | 61 ++++---- .../services/jsonrpc/TronJsonRpcImpl.java | 145 ++++++++++-------- 6 files changed, 183 insertions(+), 110 deletions(-) create mode 100644 common/src/main/java/org/tron/core/exception/JsonRpcMethodNotFoundException.java diff --git a/chainbase/src/main/java/org/tron/core/db/TransactionStore.java b/chainbase/src/main/java/org/tron/core/db/TransactionStore.java index 38d0d9c3a84..342550ecb4a 100644 --- a/chainbase/src/main/java/org/tron/core/db/TransactionStore.java +++ b/chainbase/src/main/java/org/tron/core/db/TransactionStore.java @@ -81,16 +81,24 @@ public TransactionCapsule get(byte[] key) throws BadItemException { if (ArrayUtils.isEmpty(value)) { return null; } + TransactionCapsule transactionCapsule = null; + long blockHigh = -1; + if (value.length == 8) { - long blockHigh = ByteArray.toLong(value); + blockHigh = ByteArray.toLong(value); transactionCapsule = getTransactionFromBlockStore(key, blockHigh); if (transactionCapsule == null) { transactionCapsule = getTransactionFromKhaosDatabase(key, blockHigh); } } - return transactionCapsule == null ? new TransactionCapsule(value) : transactionCapsule; + if (transactionCapsule == null) { + return new TransactionCapsule(value); + } else { + transactionCapsule.setBlockNum(blockHigh); + return transactionCapsule; + } } @Override diff --git a/common/src/main/java/org/tron/core/exception/JsonRpcMethodNotFoundException.java b/common/src/main/java/org/tron/core/exception/JsonRpcMethodNotFoundException.java new file mode 100644 index 00000000000..d8e18168d9d --- /dev/null +++ b/common/src/main/java/org/tron/core/exception/JsonRpcMethodNotFoundException.java @@ -0,0 +1,16 @@ +package org.tron.core.exception; + +public class JsonRpcMethodNotFoundException extends TronException { + + public JsonRpcMethodNotFoundException() { + super(); + } + + public JsonRpcMethodNotFoundException(String msg) { + super(msg); + } + + public JsonRpcMethodNotFoundException(String message, Throwable cause) { + super(message, cause); + } +} \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index c4cba6f0784..86df095dfa3 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -497,11 +497,11 @@ public static long parseQuantityValue(String value) throws JsonRpcInvalidParamsE public static long getEnergyUsageTotal(Transaction transaction, Wallet wallet) { long energyUsageTotal = 0; - String txID = ByteArray.toHexString(Sha256Hash + byte[] txHash = Sha256Hash .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray())); + transaction.getRawData().toByteArray()); TransactionInfo transactionInfo = wallet - .getTransactionInfoById(ByteString.copyFrom(txID.getBytes())); + .getTransactionInfoById(ByteString.copyFrom(txHash)); if (transactionInfo != null) { energyUsageTotal = transactionInfo.getReceipt().getEnergyUsageTotal(); } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java index dc67b998e69..8563edd682d 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java @@ -3,6 +3,7 @@ import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getToAddress; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTransactionAmount; + import com.google.protobuf.ByteString; import java.util.Arrays; import lombok.ToString; @@ -11,6 +12,7 @@ import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.TransactionCapsule; import org.tron.protos.Protocol; +import org.tron.protos.Protocol.Transaction; import org.tron.protos.Protocol.Transaction.Contract; @ToString @@ -33,6 +35,20 @@ public class TransactionResult { public String r; public String s; + private void parseSignature(Transaction tx) { + ByteString signature = tx.getSignature(0); // r[32] + s[32] + v[1] + byte[] signData = signature.toByteArray(); + byte[] rByte = Arrays.copyOfRange(signData, 0, 32); + byte[] sByte = Arrays.copyOfRange(signData, 32, 64); + byte vByte = signData[64]; + if (vByte < 27) { + vByte += 27; + } + v = ByteArray.toJsonHex(vByte); + r = ByteArray.toJsonHex(rByte); + s = ByteArray.toJsonHex(sByte); + } + public TransactionResult(BlockCapsule blockCapsule, int index, Protocol.Transaction tx, long energyUsageTotal, long energyFee, Wallet wallet) { byte[] txId = new TransactionCapsule(tx).getTransactionId().getBytes(); @@ -59,13 +75,34 @@ public TransactionResult(BlockCapsule blockCapsule, int index, Protocol.Transact gasPrice = ByteArray.toJsonHex(energyFee); input = ByteArray.toJsonHex(tx.getRawData().getData().toByteArray()); - ByteString signature = tx.getSignature(0); // r[32] + s[32] + v[1] - byte[] signData = signature.toByteArray(); - byte vByte = (byte) (signData[64] + 27); // according to Base64toBytes - byte[] rByte = Arrays.copyOfRange(signData, 0, 32); - byte[] sByte = Arrays.copyOfRange(signData, 32, 64); - v = ByteArray.toJsonHex(vByte); - r = ByteArray.toJsonHex(rByte); - s = ByteArray.toJsonHex(sByte); + parseSignature(tx); + } + + public TransactionResult(Transaction tx, Wallet wallet) { + byte[] txid = new TransactionCapsule(tx).getTransactionId().getBytes(); + hash = ByteArray.toJsonHex(txid); + nonce = null; // no value + blockHash = "0x"; + blockNumber = "0x"; + transactionIndex = "0x"; + + if (!tx.getRawData().getContractList().isEmpty()) { + Contract contract = tx.getRawData().getContract(0); + byte[] fromByte = TransactionCapsule.getOwner(contract); + byte[] toByte = getToAddress(tx); + from = ByteArray.toJsonHexAddress(fromByte); + to = ByteArray.toJsonHexAddress(toByte); + value = ByteArray.toJsonHex(getTransactionAmount(contract, hash, wallet)); + } else { + from = null; + to = null; + value = null; + } + + gas = "0x0"; + gasPrice = "0x"; + input = ByteArray.toJsonHex(tx.getRawData().getData().toByteArray()); + + parseSignature(tx); } } \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 7f5cd3d4275..12f20b06607 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -1,27 +1,19 @@ package org.tron.core.services.jsonrpc; -import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.addressHashToByteArray; - import com.alibaba.fastjson.JSONObject; -import com.google.protobuf.ByteString; import com.googlecode.jsonrpc4j.JsonRpcError; import com.googlecode.jsonrpc4j.JsonRpcErrors; import com.googlecode.jsonrpc4j.JsonRpcMethod; import java.util.Arrays; import java.util.List; import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; import lombok.ToString; import lombok.Value; -import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; -import org.tron.api.GrpcAPI.BytesMessage; -import org.tron.core.Wallet; import org.tron.core.exception.JsonRpcInternalException; import org.tron.core.exception.JsonRpcInvalidParamsException; import org.tron.core.exception.JsonRpcInvalidRequestException; -import org.tron.protos.Protocol.Transaction.Contract.ContractType; -import org.tron.protos.contract.SmartContractOuterClass.SmartContract; +import org.tron.core.exception.JsonRpcMethodNotFoundException; @Component public interface TronJsonRpc { @@ -291,73 +283,76 @@ TransactionJson buildTransaction(BuildArguments args) // not supported @JsonRpcMethod("eth_submitWork") @JsonRpcErrors({ - @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), + @JsonRpcError(exception = JsonRpcMethodNotFoundException.class, code = -32601, data = "{}"), }) - boolean ethSubmitWork(String nonce, String header, String digest); + boolean ethSubmitWork(String nonce, String header, String digest) + throws JsonRpcMethodNotFoundException; @JsonRpcMethod("eth_sendRawTransaction") @JsonRpcErrors({ - @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), + @JsonRpcError(exception = JsonRpcMethodNotFoundException.class, code = -32601, data = "{}"), }) - String ethSendRawTransaction(String rawData); + String ethSendRawTransaction(String rawData) throws JsonRpcMethodNotFoundException; @JsonRpcMethod("eth_sendTransaction") @JsonRpcErrors({ - @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), + @JsonRpcError(exception = JsonRpcMethodNotFoundException.class, code = -32601, data = "{}"), }) - String ethSendTransaction(CallArguments transactionArgs); + String ethSendTransaction(CallArguments transactionArgs) throws JsonRpcMethodNotFoundException; @JsonRpcMethod("eth_sign") @JsonRpcErrors({ - @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), + @JsonRpcError(exception = JsonRpcMethodNotFoundException.class, code = -32601, data = "{}"), }) - String ethSign(String addr, String data); + String ethSign(String addr, String data) throws JsonRpcMethodNotFoundException; @JsonRpcMethod("eth_signTransaction") @JsonRpcErrors({ - @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), + @JsonRpcError(exception = JsonRpcMethodNotFoundException.class, code = -32601, data = "{}"), }) - String ethSignTransaction(CallArguments transactionArgs); + String ethSignTransaction(CallArguments transactionArgs) throws JsonRpcMethodNotFoundException; @JsonRpcMethod("parity_nextNonce") @JsonRpcErrors({ - @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), + @JsonRpcError(exception = JsonRpcMethodNotFoundException.class, code = -32601, data = "{}"), }) - String parityNextNonce(String address); + String parityNextNonce(String address) throws JsonRpcMethodNotFoundException; @JsonRpcMethod("eth_getTransactionCount") @JsonRpcErrors({ - @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), + @JsonRpcError(exception = JsonRpcMethodNotFoundException.class, code = -32601, data = "{}"), }) - String getSendTransactionCountOfAddress(String address, String blockNumOrTag); + String getSendTransactionCountOfAddress(String address, String blockNumOrTag) + throws JsonRpcMethodNotFoundException; @JsonRpcMethod("eth_getCompilers") @JsonRpcErrors({ - @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), + @JsonRpcError(exception = JsonRpcMethodNotFoundException.class, code = -32601, data = "{}"), }) - String[] getCompilers(); + String[] getCompilers() throws JsonRpcMethodNotFoundException; @JsonRpcMethod("eth_compileSolidity") @JsonRpcErrors({ - @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), + @JsonRpcError(exception = JsonRpcMethodNotFoundException.class, code = -32601, data = "{}"), }) - CompilationResult ethCompileSolidity(String contract); + CompilationResult ethCompileSolidity(String contract) throws JsonRpcMethodNotFoundException; @JsonRpcMethod("eth_compileLLL") @JsonRpcErrors({ - @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), + @JsonRpcError(exception = JsonRpcMethodNotFoundException.class, code = -32601, data = "{}"), }) - CompilationResult ethCompileLLL(String contract); + CompilationResult ethCompileLLL(String contract) throws JsonRpcMethodNotFoundException; @JsonRpcMethod("eth_compileSerpent") @JsonRpcErrors({ - @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), + @JsonRpcError(exception = JsonRpcMethodNotFoundException.class, code = -32601, data = "{}"), }) - CompilationResult ethCompileSerpent(String contract); + CompilationResult ethCompileSerpent(String contract) throws JsonRpcMethodNotFoundException; @JsonRpcMethod("eth_submitHashrate") @JsonRpcErrors({ - @JsonRpcError(exception = UnsupportedOperationException.class, code = -32601, data = "{}"), + @JsonRpcError(exception = JsonRpcMethodNotFoundException.class, code = -32601, data = "{}"), }) - CompilationResult ethSubmitHashrate(String hashrate, String id); + CompilationResult ethSubmitHashrate(String hashrate, String id) + throws JsonRpcMethodNotFoundException; } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index a3f45047e53..932d146cbec 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -10,6 +10,7 @@ import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTxID; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.triggerCallContract; + import com.alibaba.fastjson.JSON; import com.google.protobuf.ByteString; import com.google.protobuf.GeneratedMessageV3; @@ -41,6 +42,7 @@ import org.tron.core.exception.JsonRpcInternalException; import org.tron.core.exception.JsonRpcInvalidParamsException; import org.tron.core.exception.JsonRpcInvalidRequestException; +import org.tron.core.exception.JsonRpcMethodNotFoundException; import org.tron.core.exception.VMIllegalException; import org.tron.core.services.NodeInfoService; import org.tron.core.services.http.JsonFormat; @@ -184,10 +186,11 @@ private BlockResult getBlockResult(Block block, boolean fullTx) { br.totalDifficulty = null; // no value br.extraData = null; // no value br.size = ByteArray.toJsonHex(block.getSerializedSize()); - br.gasLimit = null; br.timestamp = ByteArray.toJsonHex(blockCapsule.getTimeStamp()); long gasUsedInBlock = 0; + long gasLimitInBlock = 0; + List txes = new ArrayList<>(); List transactionsList = block.getTransactionsList(); List transactionInfoList = @@ -197,6 +200,7 @@ private BlockResult getBlockResult(Block block, boolean fullTx) { for (int i = 0; i < transactionsList.size(); i++) { Transaction transaction = transactionsList.get(i); + gasLimitInBlock += transaction.getRawData().getFeeLimit(); long energyUsageTotal = getEnergyUsageTotal(transactionInfoList, i, blockCapsule.getNum()); gasUsedInBlock += energyUsageTotal; @@ -206,19 +210,21 @@ private BlockResult getBlockResult(Block block, boolean fullTx) { } } else { for (int i = 0; i < transactionsList.size(); i++) { + gasLimitInBlock += transactionsList.get(i).getRawData().getFeeLimit(); gasUsedInBlock += getEnergyUsageTotal(transactionInfoList, i, blockCapsule.getNum()); - String txID = ByteArray.toHexString(Sha256Hash + byte[] txHash = Sha256Hash .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transactionsList.get(i).getRawData().toByteArray())); - txes.add(ByteArray.toJsonHex(txID.getBytes())); + transactionsList.get(i).getRawData().toByteArray()); + txes.add(ByteArray.toJsonHex(txHash)); } } br.transactions = txes.toArray(); + br.gasLimit = ByteArray.toJsonHex(gasLimitInBlock); br.gasUsed = ByteArray.toJsonHex(gasUsedInBlock); List ul = new ArrayList<>(); - br.uncles = ul.toArray(new String[ul.size()]); + br.uncles = ul.toArray(new String[0]); return br; } @@ -456,36 +462,6 @@ public String estimateGas(CallArguments args) throws JsonRpcInvalidRequestExcept } } - @Override - public String[] getCompilers() { - throw new UnsupportedOperationException( - "the method eth_getCompilers does not exist/is not available"); - } - - @Override - public CompilationResult ethCompileSolidity(String contract) { - throw new UnsupportedOperationException( - "the method eth_compileSolidity does not exist/is not available"); - } - - @Override - public CompilationResult ethCompileLLL(String contract) { - throw new UnsupportedOperationException( - "the method eth_compileLLL does not exist/is not available"); - } - - @Override - public CompilationResult ethCompileSerpent(String contract) { - throw new UnsupportedOperationException( - "the method eth_compileSerpent does not exist/is not available"); - } - - @Override - public CompilationResult ethSubmitHashrate(String hashrate, String id) { - throw new UnsupportedOperationException( - "the method eth_submitHashrate does not exist/is not available"); - } - @Override public TransactionResult getTransactionByHash(String txId) throws JsonRpcInvalidParamsException { ByteString transactionId = ByteString.copyFrom(hashToByteArray(txId)); @@ -498,25 +474,30 @@ public TransactionResult getTransactionByHash(String txId) throws JsonRpcInvalid } BlockCapsule blockCapsule = wallet.getBlockCapsuleByNum(transactionCapsule.getBlockNum()); - int transactionIndex = getTransactionIndex( - ByteArray.toHexString(transactionCapsule.getTransactionId().getBytes()), - blockCapsule.getInstance().getTransactionsList()); - - if (transactionIndex == -1) { + if (blockCapsule == null) { + return new TransactionResult(transactionCapsule.getInstance(), wallet); + } else { + int transactionIndex = getTransactionIndex( + ByteArray.toHexString(transactionCapsule.getTransactionId().getBytes()), + blockCapsule.getInstance().getTransactionsList()); + + if (transactionIndex == -1) { + return null; + } + + long energyUsageTotal = 0; + return new TransactionResult(blockCapsule, transactionIndex, + transactionCapsule.getInstance(), energyUsageTotal, + wallet.getEnergyFee(blockCapsule.getTimeStamp()), wallet); + } + } else { + Block block = wallet.getBlockByNum(transactionInfo.getBlockNumber()); + if (block == null) { return null; } - long energyUsageTotal = 0; - return new TransactionResult(blockCapsule, transactionIndex, transactionCapsule.getInstance(), - energyUsageTotal, wallet.getEnergyFee(blockCapsule.getTimeStamp()), wallet); + return formatTransactionResult(transactionInfo, block); } - - Block block = wallet.getBlockByNum(transactionInfo.getBlockNumber()); - if (block == null) { - return null; - } - - return formatTransactionResult(transactionInfo, block); } private TransactionResult formatTransactionResult(TransactionInfo transactioninfo, Block block) { @@ -904,44 +885,80 @@ public TransactionJson buildTransaction(BuildArguments args) } @Override - public boolean ethSubmitWork(String nonceHex, String headerHex, String digestHex) { - throw new UnsupportedOperationException( + public boolean ethSubmitWork(String nonceHex, String headerHex, String digestHex) + throws JsonRpcMethodNotFoundException { + throw new JsonRpcMethodNotFoundException( "the method eth_submitWork does not exist/is not available"); } @Override - public String ethSendRawTransaction(String rawData) { - throw new UnsupportedOperationException( + public String ethSendRawTransaction(String rawData) throws JsonRpcMethodNotFoundException { + throw new JsonRpcMethodNotFoundException( "the method eth_sendRawTransaction does not exist/is not available"); } @Override - public String ethSendTransaction(CallArguments args) { - throw new UnsupportedOperationException( + public String ethSendTransaction(CallArguments args) throws JsonRpcMethodNotFoundException { + throw new JsonRpcMethodNotFoundException( "the method eth_sendTransaction does not exist/is not available"); } @Override - public String ethSign(String address, String msg) { - throw new UnsupportedOperationException( + public String ethSign(String address, String msg) throws JsonRpcMethodNotFoundException { + throw new JsonRpcMethodNotFoundException( "the method eth_sign does not exist/is not available"); } @Override - public String ethSignTransaction(CallArguments transactionArgs) { - throw new UnsupportedOperationException( + public String ethSignTransaction(CallArguments transactionArgs) + throws JsonRpcMethodNotFoundException { + throw new JsonRpcMethodNotFoundException( "the method eth_signTransaction does not exist/is not available"); } @Override - public String parityNextNonce(String address) { - throw new UnsupportedOperationException( + public String parityNextNonce(String address) throws JsonRpcMethodNotFoundException { + throw new JsonRpcMethodNotFoundException( "the method parity_nextNonce does not exist/is not available"); } @Override - public String getSendTransactionCountOfAddress(String address, String blockNumOrTag) { - throw new UnsupportedOperationException( + public String getSendTransactionCountOfAddress(String address, String blockNumOrTag) + throws JsonRpcMethodNotFoundException { + throw new JsonRpcMethodNotFoundException( "the method eth_getTransactionCount does not exist/is not available"); } + + @Override + public String[] getCompilers() throws JsonRpcMethodNotFoundException { + throw new JsonRpcMethodNotFoundException( + "the method eth_getCompilers does not exist/is not available"); + } + + @Override + public CompilationResult ethCompileSolidity(String contract) + throws JsonRpcMethodNotFoundException { + throw new JsonRpcMethodNotFoundException( + "the method eth_compileSolidity does not exist/is not available"); + } + + @Override + public CompilationResult ethCompileLLL(String contract) throws JsonRpcMethodNotFoundException { + throw new JsonRpcMethodNotFoundException( + "the method eth_compileLLL does not exist/is not available"); + } + + @Override + public CompilationResult ethCompileSerpent(String contract) + throws JsonRpcMethodNotFoundException { + throw new JsonRpcMethodNotFoundException( + "the method eth_compileSerpent does not exist/is not available"); + } + + @Override + public CompilationResult ethSubmitHashrate(String hashrate, String id) + throws JsonRpcMethodNotFoundException { + throw new JsonRpcMethodNotFoundException( + "the method eth_submitHashrate does not exist/is not available"); + } } From 30c50dec2b6339ef4728eecfc0abe1de844ffd74 Mon Sep 17 00:00:00 2001 From: neo hong Date: Thu, 26 Aug 2021 10:50:42 +0800 Subject: [PATCH 159/341] add conditions --- .../src/main/java/org/tron/core/actuator/VMActuator.java | 5 ++++- .../src/main/java/org/tron/core/vm/program/Program.java | 9 ++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/actuator/VMActuator.java b/actuator/src/main/java/org/tron/core/actuator/VMActuator.java index 2aaff4fc62e..54502a056ee 100644 --- a/actuator/src/main/java/org/tron/core/actuator/VMActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/VMActuator.java @@ -299,7 +299,10 @@ private void create() if (contract == null) { throw new ContractValidateException("Cannot get CreateSmartContract from transaction"); } - SmartContract newSmartContract = contract.getNewContract().toBuilder().setVersion(1).build(); + SmartContract newSmartContract = contract.getNewContract(); + if (VMConfig.allowTvmCompatibleEvm()) { + newSmartContract = contract.getNewContract().toBuilder().setVersion(1).build(); + } if (!contract.getOwnerAddress().equals(newSmartContract.getOriginAddress())) { logger.info("OwnerAddress not equals OriginAddress"); throw new ContractValidateException("OwnerAddress is not equals OriginAddress"); diff --git a/actuator/src/main/java/org/tron/core/vm/program/Program.java b/actuator/src/main/java/org/tron/core/vm/program/Program.java index a6639a7c850..8ea30cfca07 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/Program.java +++ b/actuator/src/main/java/org/tron/core/vm/program/Program.java @@ -798,11 +798,10 @@ this, new DataWord(newAddress), getContractAddress(), value, new DataWord(0), // 4. CREATE THE CONTRACT OUT OF RETURN byte[] code = createResult.getHReturn(); - if (config.allowTvmLondon() && code[0] == (byte) 0xEF) { - if (null == createResult.getException()) { - createResult.setException(Program.Exception - .invalidOpCode((byte) 0xEF)); - } + if (code.length != 0 && config.allowTvmLondon() && code[0] == (byte) 0xEF) { + // todo dealwith exception + createResult.setException(new BytecodeExecutionException( + "can't create a contract start with 0xef")); } long saveCodeEnergy = (long) getLength(code) * EnergyCost.getInstance().getCREATE_DATA(); From 13d64204782592a0d40a73cd774a08db298c56e4 Mon Sep 17 00:00:00 2001 From: Asuka Date: Thu, 26 Aug 2021 11:56:00 +0800 Subject: [PATCH 160/341] feature: forbid sending trx to new version contract by TransferActuator --- .../tron/core/actuator/TransferActuator.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/actuator/src/main/java/org/tron/core/actuator/TransferActuator.java b/actuator/src/main/java/org/tron/core/actuator/TransferActuator.java index 3b9c2ecc3aa..12536a7f92f 100755 --- a/actuator/src/main/java/org/tron/core/actuator/TransferActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/TransferActuator.java @@ -10,6 +10,7 @@ import org.tron.common.utils.Commons; import org.tron.common.utils.DecodeUtil; import org.tron.core.capsule.AccountCapsule; +import org.tron.core.capsule.ContractCapsule; import org.tron.core.capsule.TransactionResultCapsule; import org.tron.core.exception.BalanceInsufficientException; import org.tron.core.exception.ContractExeException; @@ -137,6 +138,23 @@ public boolean validate() throws ContractValidateException { } + // after AllowTvmCompatibleEvm proposal, send trx to smartContract which version is one + // by actuator is not allowed. + if (dynamicStore.getAllowTvmCompatibleEvm() == 1 + && toAccount != null + && toAccount.getType() == AccountType.Contract) { + + ContractCapsule contractCapsule = chainBaseManager.getContractStore().get(toAddress); + if (contractCapsule == null) { // this can not happen + throw new ContractValidateException( + "Account type is Contract, but it is not exist in contract store."); + } else if (contractCapsule.getContractVersion() == 1) { + throw new ContractValidateException( + "Cannot transfer TRX to a smartContract which version is one. " + + "Instead please use TriggerSmartContract "); + } + } + if (balance < Math.addExact(amount, fee)) { throw new ContractValidateException( "Validate TransferContract error, balance is not sufficient."); From 5565a764d609ecdd37c343ab381b793ad72a7a3e Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 26 Aug 2021 13:59:41 +0800 Subject: [PATCH 161/341] feat: add loader test for proposal empty, move parseEnergyPrice and add test, change chainId to the hash of the genesis block --- .../src/main/java/org/tron/core/Wallet.java | 22 ++++------ .../core/services/jsonrpc/JsonRpcApiUtil.java | 15 +++++++ .../services/jsonrpc/TransactionResult.java | 1 - .../core/services/jsonrpc/TronJsonRpc.java | 2 +- .../services/jsonrpc/TronJsonRpcImpl.java | 12 ++++-- .../EnergyPriceHistoryLoaderTest.java | 43 ++++++++++++++++--- .../core/db/api/AssetUpdateHelperTest.java | 4 +- .../org/tron/core/jsonrpc/JsonRpcTest.java | 27 +++--------- 8 files changed, 75 insertions(+), 51 deletions(-) rename framework/src/test/java/org/tron/core/db/{api => }/EnergyPriceHistoryLoaderTest.java (78%) diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index 895e2e76e44..f07c8a82db6 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -26,6 +26,7 @@ import static org.tron.core.config.Parameter.DatabaseConstants.EXCHANGE_COUNT_LIMIT_MAX; import static org.tron.core.config.Parameter.DatabaseConstants.MARKET_COUNT_LIMIT_MAX; import static org.tron.core.config.Parameter.DatabaseConstants.PROPOSAL_COUNT_LIMIT_MAX; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.parseEnergyFee; import com.google.common.collect.ContiguousSet; import com.google.common.collect.DiscreteDomain; @@ -3850,26 +3851,19 @@ public long getEnergyFee(long timestamp) { try { String energyPriceHistory = chainBaseManager.getDynamicPropertiesStore().getEnergyPriceHistory(); - return getEnergyFee(timestamp, energyPriceHistory); + long energyFee = parseEnergyFee(timestamp, energyPriceHistory); + + if (energyFee == -1) { + energyFee = getEnergyFee(); + } + + return energyFee; } catch (Exception e) { logger.error("getEnergyFee timestamp={} failed, error is {}", timestamp, e.getMessage()); return getEnergyFee(); } } - public long getEnergyFee(long timestamp, String energyPriceHistory) { - String[] priceList = energyPriceHistory.split(","); - for (int i = priceList.length - 1; i >= 0; i--) { - String[] priceArray = priceList[i].split(":"); - long time = Long.parseLong(priceArray[0]); - long price = Long.parseLong(priceArray[1]); - if (timestamp > time) { - return price; - } - } - - return getEnergyFee(); - } } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index 86df095dfa3..33a0ee0dba1 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -540,4 +540,19 @@ public static int getTransactionIndex(String txId, List txList) { return transactionIndex; } + + public static long parseEnergyFee(long timestamp, String energyPriceHistory) { + String[] priceList = energyPriceHistory.split(","); + + for (int i = priceList.length - 1; i >= 0; i--) { + String[] priceArray = priceList[i].split(":"); + long time = Long.parseLong(priceArray[0]); + long price = Long.parseLong(priceArray[1]); + if (timestamp > time) { + return price; + } + } + + return -1; + } } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java index 8563edd682d..85f6be8c8ff 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java @@ -3,7 +3,6 @@ import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getToAddress; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTransactionAmount; - import com.google.protobuf.ByteString; import java.util.Arrays; import lombok.ToString; diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 12f20b06607..295930f4f1b 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -158,7 +158,7 @@ BlockResult ethGetBlockByNumber(String bnOrId, Boolean fullTransactionObjects) String getNetVersion(); @JsonRpcMethod("eth_chainId") - String ethChainId(); + String ethChainId() throws JsonRpcInternalException; @JsonRpcMethod("net_listening") boolean isListening(); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 932d146cbec..f8985fb7a5c 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -10,7 +10,6 @@ import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTxID; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.triggerCallContract; - import com.alibaba.fastjson.JSON; import com.google.protobuf.ByteString; import com.google.protobuf.GeneratedMessageV3; @@ -236,8 +235,13 @@ public String getNetVersion() { } @Override - public String ethChainId() { - return ByteArray.toJsonHex(chainId); + public String ethChainId() throws JsonRpcInternalException { + // return hash of genesis block + try { + return ByteArray.toJsonHex(wallet.getBlockCapsuleByNum(0).getBlockId().getBytes()); + } catch (Exception e) { + throw new JsonRpcInternalException(e.getMessage()); + } } @Override @@ -525,7 +529,7 @@ private TransactionResult formatTransactionResult(TransactionInfo transactioninf energyUsageTotal, wallet.getEnergyFee(blockCapsule.getTimeStamp()), wallet); } - public TransactionResult getTransactionByBlockAndIndex(Block block, String index) + private TransactionResult getTransactionByBlockAndIndex(Block block, String index) throws JsonRpcInvalidParamsException { int txIndex; try { diff --git a/framework/src/test/java/org/tron/core/db/api/EnergyPriceHistoryLoaderTest.java b/framework/src/test/java/org/tron/core/db/EnergyPriceHistoryLoaderTest.java similarity index 78% rename from framework/src/test/java/org/tron/core/db/api/EnergyPriceHistoryLoaderTest.java rename to framework/src/test/java/org/tron/core/db/EnergyPriceHistoryLoaderTest.java index a96de1d2e04..29759c915ef 100644 --- a/framework/src/test/java/org/tron/core/db/api/EnergyPriceHistoryLoaderTest.java +++ b/framework/src/test/java/org/tron/core/db/EnergyPriceHistoryLoaderTest.java @@ -1,5 +1,6 @@ -package org.tron.core.db.api; +package org.tron.core.db; +import static org.tron.core.store.DynamicPropertiesStore.DEFAULT_ENERGY_PRICE_HISTORY; import static org.tron.core.utils.ProposalUtil.ProposalType.ALLOW_CREATION_OF_CONTRACTS; import static org.tron.core.utils.ProposalUtil.ProposalType.ASSET_ISSUE_FEE; import static org.tron.core.utils.ProposalUtil.ProposalType.ENERGY_FEE; @@ -14,7 +15,7 @@ import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; -import org.testng.annotations.Test; +import org.junit.Test; import org.tron.common.application.TronApplicationContext; import org.tron.common.utils.FileUtil; import org.tron.core.ChainBaseManager; @@ -22,6 +23,8 @@ import org.tron.core.capsule.ProposalCapsule; import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; +import org.tron.core.db.api.EnergyPriceHistoryLoader; +import org.tron.core.store.ProposalStore; import org.tron.protos.Protocol.Proposal; import org.tron.protos.Protocol.Proposal.State; @@ -30,7 +33,7 @@ public class EnergyPriceHistoryLoaderTest { private static ChainBaseManager chainBaseManager; private static TronApplicationContext context; - private static String dbPath = "output_EnergyPriceHistoryLoaderTest_test"; + private static String dbPath = "EnergyPriceHistoryLoaderTest"; private static long t1 = 1542607200000L; private static long price1 = 20; private static long t3 = 1544724000000L; @@ -51,7 +54,7 @@ public static void init() { } @AfterClass - public static void removeDB() { + public static void destroy() { Args.clearParam(); context.destroy(); if (FileUtil.deleteDir(new File(dbPath))) { @@ -128,7 +131,6 @@ private static void initProposal(Map parameters, long timestamp, Sta @Test public void testLoader() { - if (chainBaseManager == null) { init(); } @@ -146,8 +148,35 @@ public void testLoader() { loader.getEnergyProposals(); String historyStr = loader.parseProposalsToStr(); - removeDB(); - Assert.assertEquals(expectedRes, historyStr); } + + @Test + public void testProposalEmpty() { + if (chainBaseManager == null) { + init(); + } + + // clean DB firstly + ProposalStore proposalStore = chainBaseManager.getProposalStore(); + proposalStore.forEach( + bytesCapsuleEntry -> proposalStore + .delete(bytesCapsuleEntry.getKey())); + chainBaseManager.getDynamicPropertiesStore().saveEnergyPriceHistoryDone(0); + + String preEnergyPriceHistory = + chainBaseManager.getDynamicPropertiesStore().getEnergyPriceHistory(); + Assert.assertEquals(DEFAULT_ENERGY_PRICE_HISTORY, preEnergyPriceHistory); + + // loader work + EnergyPriceHistoryLoader loader = new EnergyPriceHistoryLoader(chainBaseManager); + loader.doWork(); + + // check result + String afterEnergyPriceHistory = + chainBaseManager.getDynamicPropertiesStore().getEnergyPriceHistory(); + Assert.assertEquals(DEFAULT_ENERGY_PRICE_HISTORY, afterEnergyPriceHistory); + Assert.assertEquals(1L, + chainBaseManager.getDynamicPropertiesStore().getEnergyPriceHistoryDone()); + } } diff --git a/framework/src/test/java/org/tron/core/db/api/AssetUpdateHelperTest.java b/framework/src/test/java/org/tron/core/db/api/AssetUpdateHelperTest.java index 7f4c5426781..dcb899dde19 100644 --- a/framework/src/test/java/org/tron/core/db/api/AssetUpdateHelperTest.java +++ b/framework/src/test/java/org/tron/core/db/api/AssetUpdateHelperTest.java @@ -7,7 +7,7 @@ import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; -import org.testng.annotations.Test; +import org.junit.Test; import org.tron.common.application.Application; import org.tron.common.application.ApplicationFactory; import org.tron.common.application.TronApplicationContext; @@ -155,7 +155,5 @@ public void test() { Assert.assertEquals( 30000000L, accountCapsule.getLatestAssetOperationTimeMapV2().get("1000001").longValue()); } - - removeDb(); } } diff --git a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java index a33d20bfdbd..5d9bf0d5736 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java @@ -1,6 +1,7 @@ package org.tron.core.jsonrpc; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getMethodSign; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.parseEnergyFee; import org.bouncycastle.util.encoders.Hex; import org.junit.Assert; @@ -78,30 +79,14 @@ private String generateStorageParameter() { return sb.toString(); } - private long parsePrice(long timestamp, String energyPriceHistory) { - String[] priceList = energyPriceHistory.split(","); - - for (int i = priceList.length - 1; i >= 0; i--) { - String[] priceArray = priceList[i].split(":"); - long time = Long.parseLong(priceArray[0]); - long price = Long.parseLong(priceArray[1]); - if (timestamp > time) { - return price; - } - } - - return 0; - } - @Test public void testGetEnergyPrice() { String energyPriceHistory = "0:100,1542607200000:20,1544724000000:10,1606240800000:40,1613044800000:140"; - Assert.assertEquals(100L, parsePrice(1542607100000L, energyPriceHistory)); - Assert.assertEquals(20L, parsePrice(1542607210000L, energyPriceHistory)); - Assert.assertEquals(10L, parsePrice(1544724100000L, energyPriceHistory)); - Assert.assertEquals(40L, parsePrice(1606240810000L, energyPriceHistory)); - Assert.assertEquals(140L, parsePrice(1613044810000L, energyPriceHistory)); + Assert.assertEquals(100L, parseEnergyFee(1542607100000L, energyPriceHistory)); + Assert.assertEquals(20L, parseEnergyFee(1542607210000L, energyPriceHistory)); + Assert.assertEquals(10L, parseEnergyFee(1544724100000L, energyPriceHistory)); + Assert.assertEquals(40L, parseEnergyFee(1606240810000L, energyPriceHistory)); + Assert.assertEquals(140L, parseEnergyFee(1613044810000L, energyPriceHistory)); } - } From b74fb95f4130e3545cc7e058f838b82ad3d6245f Mon Sep 17 00:00:00 2001 From: liukai Date: Thu, 26 Aug 2021 15:37:47 +0800 Subject: [PATCH 162/341] add checkAppName --- start.sh | 46 +++++++++++++++++++++------------------------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/start.sh b/start.sh index 45a26814730..fa3a9c91961 100644 --- a/start.sh +++ b/start.sh @@ -43,7 +43,7 @@ buildManifest() { checkmemory() { allow_memory=8000000 allow_max_memory=48000000 - max_matespace_size=' -xx:maxmetaspacesize=512m ' + max_matespace_size=' -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m ' total=`cat /proc/meminfo |grep MemTotal |awk -F ' ' '{print $2}'` default_memory=true @@ -59,7 +59,7 @@ checkmemory() { allow_memory=$memory default_memory=false else - echo "direct memory must be greater than1111 $allow_memory!, current memory: $total!!" + echo "direct memory must be greater than $allow_memory!, current memory: $total!!" fi fi position=$[position+1] @@ -71,7 +71,7 @@ checkmemory() { exit fi if [[ $total -gt $allow_memory ]] && [[ $total -lt $allow_max_memory ]] ; then - MAX_NEW_SIZE=' -XX:NewSize=3072m -XX:MaxNewSize=3072m ' + max_new_size=' -XX:NewSize=3072m -XX:MaxNewSize=3072m ' MEM_OPT="$max_matespace_size $max_new_size" elif [[ $total -gt $allow_memory ]] ; then @@ -85,23 +85,23 @@ else fi } -if [[ $APP =~ '-' ]]; then - APP='' -fi - - -APP=${APP:-"FullNode"} -START_OPT=`echo ${@:2}` -JAR_NAME="$APP.jar" -MAX_STOP_TIME=60 -MEM_OPT='' +checkAppName() { + if [[ $APP =~ '-' ]]; then + APP='' + fi + APP=${APP:-"FullNode"} + START_OPT=`echo ${@:2}` + JAR_NAME="$APP.jar" + MAX_STOP_TIME=60 + MEM_OPT='' +} checkpid() { pid=`ps -ef | grep $JAR_NAME |grep -v grep | awk '{print $2}'` return $pid } -checkPath(){ +checkPathAndRebuild(){ path='output-directory/database' flag=1 for p in ${ALL_OPT} @@ -118,18 +118,19 @@ checkPath(){ if [[ -z "${path}" ]]; then echo '-d /path or --database-directory /path' - return 1 + exit -1 fi if [[ -d ${path} ]]; then - return 0 + rebuildManifest else echo $path 'not exist' - return 1 + exit -1 fi } stopService() { + checkAppName count=1 while [ $count -le $MAX_STOP_TIME ]; do checkpid @@ -149,6 +150,8 @@ stopService() { } startService() { + checkmemory + echo `date` >> start.log total=`cat /proc/meminfo |grep MemTotal |awk -F ' ' '{print $2}'` xmx=`echo "$total/1024/1024*0.6" | bc |awk -F. '{print $1"g"}'` @@ -162,14 +165,7 @@ startService() { echo "start java-tron with pid $pid on $HOSTNAME" } - stopService -checkPath -if [[ 0 == $? ]] ; then - rebuildManifest -else - exit -1 -fi +checkPathAndRebuild sleep 5 -checkmemory startService \ No newline at end of file From cbf9fa8b9cfa252b4fc77daf23e4351772a1e1ae Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 26 Aug 2021 16:42:46 +0800 Subject: [PATCH 163/341] feat: add test for api access filter and interceptor --- .../solidity/HttpApiOnSolidityService.java | 3 +- .../filter/HttpApiAccessFilterTest.java | 156 ++++++++++++++++ .../filter/RpcApiAccessInterceptorTest.java | 169 ++++++++++++++++++ 3 files changed, 327 insertions(+), 1 deletion(-) create mode 100644 framework/src/test/java/org/tron/core/services/filter/HttpApiAccessFilterTest.java create mode 100644 framework/src/test/java/org/tron/core/services/filter/RpcApiAccessInterceptorTest.java diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java index 8892e8d6c92..e2ca9005a4b 100644 --- a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java @@ -246,7 +246,8 @@ public void start() { "/walletsolidity/gettransactioncountbyblocknum"); context.addServlet(new ServletHolder(getNodeInfoOnSolidityServlet), "/wallet/getnodeinfo"); - context.addServlet(new ServletHolder(getNodeInfoOnSolidityServlet), "/walletsolidity/getnodeinfo"); + context.addServlet(new ServletHolder(getNodeInfoOnSolidityServlet), + "/walletsolidity/getnodeinfo"); context.addServlet(new ServletHolder(getBrokerageServlet), "/walletsolidity/getBrokerage"); context.addServlet(new ServletHolder(getRewardServlet), "/walletsolidity/getReward"); context diff --git a/framework/src/test/java/org/tron/core/services/filter/HttpApiAccessFilterTest.java b/framework/src/test/java/org/tron/core/services/filter/HttpApiAccessFilterTest.java new file mode 100644 index 00000000000..4a288b4402c --- /dev/null +++ b/framework/src/test/java/org/tron/core/services/filter/HttpApiAccessFilterTest.java @@ -0,0 +1,156 @@ +package org.tron.core.services.filter; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.apache.http.HttpResponse; +import org.apache.http.HttpStatus; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.tron.common.application.Application; +import org.tron.common.application.ApplicationFactory; +import org.tron.common.application.TronApplicationContext; +import org.tron.common.utils.FileUtil; +import org.tron.core.Constant; +import org.tron.core.config.DefaultConfig; +import org.tron.core.config.args.Args; +import org.tron.core.services.http.FullNodeHttpApiService; +import org.tron.core.services.interfaceOnPBFT.http.PBFT.HttpApiOnPBFTService; +import org.tron.core.services.interfaceOnSolidity.http.solidity.HttpApiOnSolidityService; + +public class HttpApiAccessFilterTest { + + private static final Logger logger = LoggerFactory.getLogger("Test"); + + private static TronApplicationContext context; + private static Application appTest; + private static CloseableHttpClient httpClient = HttpClients.createDefault(); + private static String dbPath = "output_http_api_access_filter_test"; + + /** + * init dependencies. + */ + @BeforeClass + public static void init() { + Args.setParam(new String[]{"-d", dbPath}, Constant.TEST_CONF); + Args.getInstance().setFullNodeAllowShieldedTransactionArgs(false); + context = new TronApplicationContext(DefaultConfig.class); + appTest = ApplicationFactory.create(context); + + FullNodeHttpApiService httpApiService = context + .getBean(FullNodeHttpApiService.class); + HttpApiOnSolidityService httpApiOnSolidityService = context + .getBean(HttpApiOnSolidityService.class); + HttpApiOnPBFTService httpApiOnPBFTService = context + .getBean(HttpApiOnPBFTService.class); + + appTest.addService(httpApiService); + appTest.addService(httpApiOnSolidityService); + appTest.addService(httpApiOnPBFTService); + appTest.initServices(Args.getInstance()); + appTest.startServices(); + appTest.startup(); + } + + /** + * destroy the context. + */ + @AfterClass + public static void destroy() { + Args.clearParam(); + appTest.shutdownServices(); + appTest.shutdown(); + context.destroy(); + if (FileUtil.deleteDir(new File(dbPath))) { + logger.info("Release resources successful."); + } else { + logger.info("Release resources failure."); + } + } + + @Test + public void testHttpFilter() { + List disabledApiList = new ArrayList<>(); + disabledApiList.add("getaccount"); + disabledApiList.add("getnowblock"); + + List emptyList = Collections.emptyList(); + + List patterns = new ArrayList<>(); + patterns.add("/walletsolidity/"); + patterns.add("/walletpbft/"); + patterns.add("/wallet/"); + + int httpPort; + String ip = "127.0.0.1"; + for (String api : disabledApiList) { + for (String pattern : patterns) { + String urlPath = pattern + api; + if (urlPath.contains("/walletsolidity")) { + httpPort = Args.getInstance().getSolidityHttpPort(); + } else if (urlPath.contains("/walletpbft")) { + httpPort = Args.getInstance().getPBFTHttpPort(); + } else { + httpPort = Args.getInstance().getFullNodeHttpPort(); + } + + String url = String.format("http://%s:%d%s", ip, httpPort, urlPath); + + Args.getInstance().setDisabledApiList(disabledApiList); + String response = sendGetRequest(url); + Assert.assertEquals("{\"Error\":\"this API is unavailable due to config\"}", + response); + + Args.getInstance().setDisabledApiList(emptyList); + int statusCode = getReuqestCode(url); + Assert.assertEquals(HttpStatus.SC_OK, statusCode); + } + } + } + + private String sendGetRequest(String url) { + HttpGet request = new HttpGet(url); + request.setHeader("User-Agent", "Java client"); + HttpResponse response = null; + try { + response = httpClient.execute(request); + BufferedReader rd = new BufferedReader( + new InputStreamReader(response.getEntity().getContent())); + StringBuffer result = new StringBuffer(); + String line; + while ((line = rd.readLine()) != null) { + result.append(line); + } + return result.toString(); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + private int getReuqestCode(String url) { + HttpGet request = new HttpGet(url); + request.setHeader("User-Agent", "Java client"); + HttpResponse response = null; + + try { + response = httpClient.execute(request); + return response.getStatusLine().getStatusCode(); + } catch (IOException e) { + e.printStackTrace(); + } + + return 0; + } +} diff --git a/framework/src/test/java/org/tron/core/services/filter/RpcApiAccessInterceptorTest.java b/framework/src/test/java/org/tron/core/services/filter/RpcApiAccessInterceptorTest.java new file mode 100644 index 00000000000..c3ef7265f65 --- /dev/null +++ b/framework/src/test/java/org/tron/core/services/filter/RpcApiAccessInterceptorTest.java @@ -0,0 +1,169 @@ +package org.tron.core.services.filter; + +import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; +import io.grpc.StatusRuntimeException; +import java.io.File; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.tron.api.GrpcAPI; +import org.tron.api.WalletGrpc; +import org.tron.api.WalletSolidityGrpc; +import org.tron.common.application.Application; +import org.tron.common.application.ApplicationFactory; +import org.tron.common.application.TronApplicationContext; +import org.tron.common.utils.FileUtil; +import org.tron.core.Constant; +import org.tron.core.config.DefaultConfig; +import org.tron.core.config.args.Args; +import org.tron.core.services.RpcApiService; +import org.tron.core.services.interfaceOnPBFT.RpcApiServiceOnPBFT; +import org.tron.core.services.interfaceOnSolidity.RpcApiServiceOnSolidity; + +public class RpcApiAccessInterceptorTest { + + private static final Logger logger = LoggerFactory.getLogger("Test"); + + private static TronApplicationContext context; + + private static WalletGrpc.WalletBlockingStub blockingStubFull = null; + private static WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubSolidity = null; + private static WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubPBFT = null; + private static Application appTest; + + private static String dbPath = "output_rpc_api_access_filter_test"; + + @Rule + public ExpectedException thrown = ExpectedException.none(); + + /** + * init logic. + */ + @BeforeClass + public static void init() { + Args.setParam(new String[] {"-d", dbPath}, Constant.TEST_CONF); + String fullNode = String.format("%s:%d", Args.getInstance().getNodeDiscoveryBindIp(), + Args.getInstance().getRpcPort()); + String solidityNode = String.format("%s:%d", Args.getInstance().getNodeDiscoveryBindIp(), + Args.getInstance().getRpcOnSolidityPort()); + String pBFTNode = String.format("%s:%d", Args.getInstance().getNodeDiscoveryBindIp(), + Args.getInstance().getRpcOnPBFTPort()); + + ManagedChannel channelFull = ManagedChannelBuilder.forTarget(fullNode) + .usePlaintext() + .build(); + ManagedChannel channelpBFT = ManagedChannelBuilder.forTarget(pBFTNode) + .usePlaintext() + .build(); + ManagedChannel channelSolidity = ManagedChannelBuilder.forTarget(solidityNode) + .usePlaintext() + .build(); + + context = new TronApplicationContext(DefaultConfig.class); + + blockingStubFull = WalletGrpc.newBlockingStub(channelFull); + blockingStubSolidity = WalletSolidityGrpc.newBlockingStub(channelSolidity); + blockingStubPBFT = WalletSolidityGrpc.newBlockingStub(channelpBFT); + + RpcApiService rpcApiService = context.getBean(RpcApiService.class); + RpcApiServiceOnSolidity rpcApiServiceOnSolidity = + context.getBean(RpcApiServiceOnSolidity.class); + RpcApiServiceOnPBFT rpcApiServiceOnPBFT = context.getBean(RpcApiServiceOnPBFT.class); + + appTest = ApplicationFactory.create(context); + appTest.addService(rpcApiService); + appTest.addService(rpcApiServiceOnSolidity); + appTest.addService(rpcApiServiceOnPBFT); + appTest.initServices(Args.getInstance()); + appTest.startServices(); + appTest.startup(); + } + + /** + * destroy the context. + */ + @AfterClass + public static void destroy() { + Args.clearParam(); + appTest.shutdownServices(); + appTest.shutdown(); + context.destroy(); + if (FileUtil.deleteDir(new File(dbPath))) { + logger.info("Release resources successful."); + } else { + logger.info("Release resources failure."); + } + } + + @Test + public void testAccessDisabledFullNode() { + List disabledApiList = new ArrayList<>(); + disabledApiList.add("getaccount"); + disabledApiList.add("getblockbynum"); + Args.getInstance().setDisabledApiList(disabledApiList); + + final GrpcAPI.NumberMessage message = GrpcAPI.NumberMessage.newBuilder().setNum(0).build(); + thrown.expect(StatusRuntimeException.class); + thrown.expectMessage("this API is unavailable due to config"); + blockingStubFull.getBlockByNum(message); + } + + @Test + public void testAccessDisabledSolidityNode() { + List disabledApiList = new ArrayList<>(); + disabledApiList.add("getaccount"); + disabledApiList.add("getblockbynum"); + Args.getInstance().setDisabledApiList(disabledApiList); + + final GrpcAPI.NumberMessage message = GrpcAPI.NumberMessage.newBuilder().setNum(0).build(); + thrown.expect(StatusRuntimeException.class); + thrown.expectMessage("this API is unavailable due to config"); + blockingStubSolidity.getBlockByNum(message); + } + + @Test + public void testAccessDisabledPBFTNode() { + List disabledApiList = new ArrayList<>(); + disabledApiList.add("getaccount"); + disabledApiList.add("getblockbynum"); + Args.getInstance().setDisabledApiList(disabledApiList); + + final GrpcAPI.NumberMessage message = GrpcAPI.NumberMessage.newBuilder().setNum(0).build(); + thrown.expect(StatusRuntimeException.class); + thrown.expectMessage("this API is unavailable due to config"); + blockingStubPBFT.getBlockByNum(message); + } + + @Test + public void testAccessNoDisabled() { + Args.getInstance().setDisabledApiList(Collections.emptyList()); + + final GrpcAPI.NumberMessage message = GrpcAPI.NumberMessage.newBuilder().setNum(0).build(); + Assert.assertNotNull(blockingStubFull.getBlockByNum(message)); + Assert.assertNotNull(blockingStubSolidity.getBlockByNum(message)); + Assert.assertNotNull(blockingStubPBFT.getBlockByNum(message)); + } + + @Test + public void testAccessDisabledNotIncluded() { + List disabledApiList = new ArrayList<>(); + disabledApiList.add("getaccount"); + Args.getInstance().setDisabledApiList(disabledApiList); + + final GrpcAPI.NumberMessage message = GrpcAPI.NumberMessage.newBuilder().setNum(0).build(); + Assert.assertNotNull(blockingStubFull.getBlockByNum(message)); + Assert.assertNotNull(blockingStubSolidity.getBlockByNum(message)); + Assert.assertNotNull(blockingStubPBFT.getBlockByNum(message)); + } + +} + From bbf0a08e03f23c14b089e62c5ccc63e1d88b0e77 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 26 Aug 2021 16:50:46 +0800 Subject: [PATCH 164/341] feat: return networkid as chainid --- .../java/org/tron/core/services/jsonrpc/TronJsonRpc.java | 2 +- .../java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 295930f4f1b..5db25a65b01 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -155,7 +155,7 @@ BlockResult ethGetBlockByNumber(String bnOrId, Boolean fullTransactionObjects) throws JsonRpcInvalidParamsException; @JsonRpcMethod("net_version") - String getNetVersion(); + String getNetVersion() throws JsonRpcInternalException; @JsonRpcMethod("eth_chainId") String ethChainId() throws JsonRpcInternalException; diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index f8985fb7a5c..8c8193d9bf6 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -229,9 +229,8 @@ private BlockResult getBlockResult(Block block, boolean fullTx) { } @Override - public String getNetVersion() { - // network id - return ByteArray.toJsonHex(networkId); + public String getNetVersion() throws JsonRpcInternalException { + return ethChainId(); } @Override From 1c4506dc750cc199a08ae5f1103b1516b10b05a3 Mon Sep 17 00:00:00 2001 From: neo hong Date: Thu, 26 Aug 2021 16:57:42 +0800 Subject: [PATCH 165/341] add contractVersion field in Program --- .../org/tron/core/vm/program/Program.java | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/vm/program/Program.java b/actuator/src/main/java/org/tron/core/vm/program/Program.java index 8ea30cfca07..b0322e87a32 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/Program.java +++ b/actuator/src/main/java/org/tron/core/vm/program/Program.java @@ -135,6 +135,7 @@ public class Program { private byte previouslyExecutedOp; private boolean stopped; private ProgramPrecompile programPrecompile; + private int contractVersion; public Program(byte[] ops, ProgramInvoke programInvoke) { @@ -308,6 +309,14 @@ public void setRootTransactionId(byte[] rootTransactionId) { this.rootTransactionId = rootTransactionId.clone(); } + public void setContractVersion(int version) { + this.contractVersion = version; + } + + public int getContractVersion() { + return this.contractVersion; + } + public long getNonce() { return nonce; } @@ -719,7 +728,7 @@ private void createContractImpl(DataWord value, byte[] programCode, byte[] newAd if (!contractAlreadyExists) { Builder builder = SmartContract.newBuilder(); - if (getContractVersion() == 1) { + if (getContractVersionByContractAddress() == 1) { builder.setVersion(1); } builder.setContractAddress(ByteString.copyFrom(newAddress)) @@ -735,7 +744,7 @@ private void createContractImpl(DataWord value, byte[] programCode, byte[] newAd deposit.createAccount(newAddress, "CreatedByContract", Protocol.AccountType.Contract); Builder builder = SmartContract.newBuilder(); - if (getContractVersion() == 1) { + if (getContractVersionByContractAddress() == 1) { builder.setVersion(1); } SmartContract newSmartContract = builder.setContractAddress(ByteString.copyFrom(newAddress)) @@ -1010,6 +1019,7 @@ this, new DataWord(contextAddress), VM vm = new VM(config); Program program = new Program(programCode, programInvoke, internalTx, config); program.setRootTransactionId(this.rootTransactionId); + program.setContractVersion(invoke.getDeposit().getContract(codeAddress).getContractVersion()); vm.play(program); callResult = program.getResult(); @@ -1463,6 +1473,10 @@ public ProgramTrace getTrace() { public void createContract2(DataWord value, DataWord memStart, DataWord memSize, DataWord salt) { byte[] senderAddress; + if (VMConfig.allowTvmCompatibleEvm() && getCallDeep() == MAX_DEPTH) { + stackPushZero(); + return; + } if(VMConfig.allowTvmIstanbul()) { senderAddress = TransactionTrace .convertToTronAddress(this.getContractAddress().getLast20Bytes()); @@ -1667,7 +1681,7 @@ public void checkTokenIdInTokenBalance(DataWord tokenIdDataWord) { } public DataWord getCallEnergy(OpCode op, DataWord requestedEnergy, DataWord availableEnergy) { - if (getContractVersion() == 1) { + if (getContractVersionByContractAddress() == 1) { DataWord availableEnergyReduce = availableEnergy.clone(); availableEnergyReduce.div(new DataWord(intToBytes(64))); availableEnergy.sub(availableEnergyReduce); @@ -1972,7 +1986,7 @@ public long withdrawReward() { return 0; } - public int getContractVersion() { + public int getContractVersionByContractAddress() { byte [] contractAddress = TransactionTrace.convertToTronAddress(getContractAddress().getLast20Bytes()); return invoke.getDeposit().getContract(contractAddress).getContractVersion(); From a1f430a61de4ca301bcf25946213ef4ae10b4483 Mon Sep 17 00:00:00 2001 From: neo hong Date: Thu, 26 Aug 2021 17:36:33 +0800 Subject: [PATCH 166/341] remove getContractVersionByAddress function --- .../main/java/org/tron/core/actuator/VMActuator.java | 1 + .../main/java/org/tron/core/vm/program/Program.java | 12 +++--------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/actuator/VMActuator.java b/actuator/src/main/java/org/tron/core/actuator/VMActuator.java index 6798a59dd6f..7473d33e277 100644 --- a/actuator/src/main/java/org/tron/core/actuator/VMActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/VMActuator.java @@ -486,6 +486,7 @@ private void call() this.vm = new VM(); rootInternalTransaction = new InternalTransaction(trx, trxType); this.program = new Program(code, programInvoke, rootInternalTransaction, vmConfig); + this.program.setContractVersion(repository.getContract(contractAddress).getContractVersion()); byte[] txId = TransactionUtil.getTransactionId(trx).getBytes(); this.program.setRootTransactionId(txId); diff --git a/actuator/src/main/java/org/tron/core/vm/program/Program.java b/actuator/src/main/java/org/tron/core/vm/program/Program.java index b0322e87a32..daa89e69e13 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/Program.java +++ b/actuator/src/main/java/org/tron/core/vm/program/Program.java @@ -728,7 +728,7 @@ private void createContractImpl(DataWord value, byte[] programCode, byte[] newAd if (!contractAlreadyExists) { Builder builder = SmartContract.newBuilder(); - if (getContractVersionByContractAddress() == 1) { + if (getContractVersion() == 1) { builder.setVersion(1); } builder.setContractAddress(ByteString.copyFrom(newAddress)) @@ -744,7 +744,7 @@ private void createContractImpl(DataWord value, byte[] programCode, byte[] newAd deposit.createAccount(newAddress, "CreatedByContract", Protocol.AccountType.Contract); Builder builder = SmartContract.newBuilder(); - if (getContractVersionByContractAddress() == 1) { + if (getContractVersion() == 1) { builder.setVersion(1); } SmartContract newSmartContract = builder.setContractAddress(ByteString.copyFrom(newAddress)) @@ -1681,7 +1681,7 @@ public void checkTokenIdInTokenBalance(DataWord tokenIdDataWord) { } public DataWord getCallEnergy(OpCode op, DataWord requestedEnergy, DataWord availableEnergy) { - if (getContractVersionByContractAddress() == 1) { + if (getContractVersion() == 1) { DataWord availableEnergyReduce = availableEnergy.clone(); availableEnergyReduce.div(new DataWord(intToBytes(64))); availableEnergy.sub(availableEnergyReduce); @@ -1986,12 +1986,6 @@ public long withdrawReward() { return 0; } - public int getContractVersionByContractAddress() { - byte [] contractAddress = - TransactionTrace.convertToTronAddress(getContractAddress().getLast20Bytes()); - return invoke.getDeposit().getContract(contractAddress).getContractVersion(); - } - /** * Denotes problem when executing Ethereum bytecode. From blockchain and peer perspective this is * quite normal situation and doesn't mean exceptional situation in terms of the program From 1646399af69e0871f9188b83a43fa1c63c206556 Mon Sep 17 00:00:00 2001 From: neo hong Date: Thu, 26 Aug 2021 18:06:38 +0800 Subject: [PATCH 167/341] set contractVersion --- .../src/main/java/org/tron/core/actuator/VMActuator.java | 8 +++++++- .../src/main/java/org/tron/core/vm/program/Program.java | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/actuator/VMActuator.java b/actuator/src/main/java/org/tron/core/actuator/VMActuator.java index 7473d33e277..f874ebcd915 100644 --- a/actuator/src/main/java/org/tron/core/actuator/VMActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/VMActuator.java @@ -377,6 +377,9 @@ private void create() vmShouldEndInUs, energyLimit); this.vm = new VM(); this.program = new Program(ops, programInvoke, rootInternalTransaction, vmConfig); + if (VMConfig.allowTvmCompatibleEvm()) { + this.program.setContractVersion(1); + } byte[] txId = TransactionUtil.getTransactionId(trx).getBytes(); this.program.setRootTransactionId(txId); if (enableEventListener && isCheckTransaction()) { @@ -486,7 +489,10 @@ private void call() this.vm = new VM(); rootInternalTransaction = new InternalTransaction(trx, trxType); this.program = new Program(code, programInvoke, rootInternalTransaction, vmConfig); - this.program.setContractVersion(repository.getContract(contractAddress).getContractVersion()); + if (VMConfig.allowTvmCompatibleEvm()) { + this.program.setContractVersion( + repository.getContract(contractAddress).getContractVersion()); + } byte[] txId = TransactionUtil.getTransactionId(trx).getBytes(); this.program.setRootTransactionId(txId); diff --git a/actuator/src/main/java/org/tron/core/vm/program/Program.java b/actuator/src/main/java/org/tron/core/vm/program/Program.java index daa89e69e13..b7ea46f502d 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/Program.java +++ b/actuator/src/main/java/org/tron/core/vm/program/Program.java @@ -796,6 +796,9 @@ this, new DataWord(newAddress), getContractAddress(), value, new DataWord(0), VM vm = new VM(config); Program program = new Program(programCode, programInvoke, internalTx, config); program.setRootTransactionId(this.rootTransactionId); + if (VMConfig.allowTvmCompatibleEvm()) { + program.setContractVersion(this.contractVersion); + } vm.play(program); createResult = program.getResult(); getTrace().merge(program.getTrace()); @@ -1019,7 +1022,10 @@ this, new DataWord(contextAddress), VM vm = new VM(config); Program program = new Program(programCode, programInvoke, internalTx, config); program.setRootTransactionId(this.rootTransactionId); - program.setContractVersion(invoke.getDeposit().getContract(codeAddress).getContractVersion()); + if (VMConfig.allowTvmCompatibleEvm()) { + program.setContractVersion( + invoke.getDeposit().getContract(codeAddress).getContractVersion()); + } vm.play(program); callResult = program.getResult(); From 9af6acaaf2855d2dbed275714ad78f8c6f2fe889 Mon Sep 17 00:00:00 2001 From: liukai Date: Fri, 27 Aug 2021 12:19:41 +0800 Subject: [PATCH 168/341] add tcmalloc release rate value --- start.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/start.sh b/start.sh index fa3a9c91961..8c681ab6640 100644 --- a/start.sh +++ b/start.sh @@ -158,6 +158,7 @@ startService() { directmem=`echo "$total/1024/1024*0.1" | bc |awk -F. '{print $1"g"}'` logtime=`date +%Y-%m-%d_%H-%M-%S` export LD_PRELOAD="/usr/lib64/libtcmalloc.so" + export TCMALLOC_RELEASE_RATE=10 nohup java -Xms$xmx -Xmx$xmx -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -Xloggc:./gc.log\ -XX:+PrintGCDateStamps -XX:+CMSParallelRemarkEnabled -XX:ReservedCodeCacheSize=256m -XX:+UseCodeCacheFlushing\ $MEM_OPT -XX:MaxDirectMemorySize=$directmem -XX:+HeapDumpOnOutOfMemoryError -jar $JAR_NAME $START_OPT -c config.conf >> start.log 2>&1 & From 0a234bcd35574ad65807cb4e19f2c6928feb6c28 Mon Sep 17 00:00:00 2001 From: neo hong Date: Fri, 27 Aug 2021 15:02:17 +0800 Subject: [PATCH 169/341] modify getCallEnergy --- actuator/src/main/java/org/tron/core/actuator/VMActuator.java | 2 -- actuator/src/main/java/org/tron/core/vm/program/Program.java | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/actuator/VMActuator.java b/actuator/src/main/java/org/tron/core/actuator/VMActuator.java index f874ebcd915..0dafcbf5709 100644 --- a/actuator/src/main/java/org/tron/core/actuator/VMActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/VMActuator.java @@ -190,8 +190,6 @@ public void execute(Object object) throws ContractExeException { byte[] code = program.getResult().getHReturn(); if (vmConfig.allowTvmLondon() && code[0] == (byte) 0xEF) { // todo deal with exception - // throw new Program.BytecodeExecutionException("Contract creation error: code cannot " - // + "start with {}", "0xEF"); if (null == result.getException()) { result.setException(Program.Exception .invalidOpCode((byte) 0xEF)); diff --git a/actuator/src/main/java/org/tron/core/vm/program/Program.java b/actuator/src/main/java/org/tron/core/vm/program/Program.java index b7ea46f502d..25d0e31c57b 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/Program.java +++ b/actuator/src/main/java/org/tron/core/vm/program/Program.java @@ -1689,7 +1689,7 @@ public void checkTokenIdInTokenBalance(DataWord tokenIdDataWord) { public DataWord getCallEnergy(OpCode op, DataWord requestedEnergy, DataWord availableEnergy) { if (getContractVersion() == 1) { DataWord availableEnergyReduce = availableEnergy.clone(); - availableEnergyReduce.div(new DataWord(intToBytes(64))); + availableEnergyReduce.div(new DataWord(64)); availableEnergy.sub(availableEnergyReduce); } return requestedEnergy.compareTo(availableEnergy) > 0 ? availableEnergy : requestedEnergy; From 65ea697d06ce11182c8e3d9aac5a4d0607c676b6 Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Fri, 27 Aug 2021 17:53:13 +0800 Subject: [PATCH 170/341] change writeBuffer for big db --- .../main/java/org/tron/common/utils/StorageUtils.java | 11 ++++++++++- framework/src/main/java/org/tron/core/db/Manager.java | 3 ++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/chainbase/src/main/java/org/tron/common/utils/StorageUtils.java b/chainbase/src/main/java/org/tron/common/utils/StorageUtils.java index acf627fde2e..f62e65a621b 100644 --- a/chainbase/src/main/java/org/tron/common/utils/StorageUtils.java +++ b/chainbase/src/main/java/org/tron/common/utils/StorageUtils.java @@ -56,6 +56,15 @@ public static Options getOptionsByDbName(String dbName) { if (hasProperty(dbName)) { return getProperty(dbName).getDbOptions(); } - return createDefaultDbOptions(); + Options options = createDefaultDbOptions(); + switch (dbName) { + case "block": + case "transactionHistoryStore": + case "transactionRetStore": + case "trans": options.writeBufferSize(256 * 1024 * 1024); + break; + default: + } + return options; } } diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index b95a3c6c299..b64ac924a89 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -1369,7 +1369,8 @@ public synchronized BlockCapsule generateBlock(Miner miner, long blockTime, long session.reset(); - logger.info("Generate block success, pendingCount: {}, rePushCount: {}, postponedCount: {}", + logger.info("Generate block {} success, pendingCount: {}, rePushCount: {}, postponedCount: {}", + blockCapsule.getNum(), pendingTransactions.size(), rePushTransactions.size(), postponedTrxCount); blockCapsule.setMerkleRoot(); From 3499968f4e694e7886ce388cf5e4e5e6b4a6d3a5 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Mon, 30 Aug 2021 12:40:44 +0800 Subject: [PATCH 171/341] feat: estimatedGas support value --- .../org/tron/core/services/jsonrpc/CallArguments.java | 6 ++++++ .../tron/core/services/jsonrpc/TronJsonRpcImpl.java | 10 ++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/CallArguments.java b/framework/src/main/java/org/tron/core/services/jsonrpc/CallArguments.java index 6f026da5c7f..a7560fcdbfe 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/CallArguments.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/CallArguments.java @@ -2,6 +2,8 @@ import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.addressHashToByteArray; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.paramStringIsNull; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.parseQuantityValue; + import com.google.protobuf.ByteString; import lombok.AllArgsConstructor; @@ -58,4 +60,8 @@ public ContractType getContractType(Wallet wallet) throws JsonRpcInvalidRequestE } return contractType; } + + public long parseValue() throws JsonRpcInvalidParamsException { + return parseQuantityValue(value); + } } \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 8c8193d9bf6..e0995721459 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -288,13 +288,14 @@ public String getTrxBalance(String address, String blockNumOrTag) } private void callTriggerConstantContract(byte[] ownerAddressByte, byte[] contractAddressByte, - byte[] data, TransactionExtention.Builder trxExtBuilder, Return.Builder retBuilder) + long value, byte[] data, TransactionExtention.Builder trxExtBuilder, + Return.Builder retBuilder) throws ContractValidateException, ContractExeException, HeaderNotFound, VMIllegalException { TriggerSmartContract triggerContract = triggerCallContract( ownerAddressByte, contractAddressByte, - 0, + value, data, 0, null @@ -322,8 +323,8 @@ private String call(byte[] ownerAddressByte, byte[] contractAddressByte, byte[] TransactionExtention trxExt; try { - callTriggerConstantContract(ownerAddressByte, contractAddressByte, data, trxExtBuilder, - retBuilder); + callTriggerConstantContract(ownerAddressByte, contractAddressByte, 0, data, + trxExtBuilder, retBuilder); } catch (ContractValidateException | VMIllegalException e) { retBuilder.setResult(false).setCode(response_code.CONTRACT_VALIDATE_ERROR) @@ -448,6 +449,7 @@ public String estimateGas(CallArguments args) throws JsonRpcInvalidRequestExcept try { callTriggerConstantContract(ownerAddress, addressHashToByteArray(args.to), + args.parseValue(), ByteArray.fromHexString(args.data), trxExtBuilder, retBuilder); From 319af4f024fc37a3d253fb764491dcccc3095f6f Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Mon, 30 Aug 2021 13:04:33 +0800 Subject: [PATCH 172/341] feat: add test for construct data --- .../core/services/jsonrpc/CallArguments.java | 2 +- .../java/org/tron/core/jsonrpc/JsonRpcTest.java | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/CallArguments.java b/framework/src/main/java/org/tron/core/services/jsonrpc/CallArguments.java index a7560fcdbfe..084c7b3382a 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/CallArguments.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/CallArguments.java @@ -54,7 +54,7 @@ public ContractType getContractType(Wallet wallet) throws JsonRpcInvalidRequestE if (StringUtils.isNotEmpty(value)) { contractType = ContractType.TransferContract; } else { - throw new JsonRpcInvalidRequestException("invalid json request"); + throw new JsonRpcInvalidRequestException("invalid json request: invalid value"); } } } diff --git a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java index 5d9bf0d5736..0d46405d72c 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java @@ -3,6 +3,7 @@ import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getMethodSign; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.parseEnergyFee; + import org.bouncycastle.util.encoders.Hex; import org.junit.Assert; import org.junit.Test; @@ -79,6 +80,21 @@ private String generateStorageParameter() { return sb.toString(); } + private String constractData(String functionSelector, String parameter) { + String data = getMethodSign(functionSelector) + parameter; + return data; + } + + @Test + public void testConstractData() { + String expectedData = + "07211ef70000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000f4240"; + + String functionSelector = "get_dy_underlying(int128,int128,uint256)"; + String parameter = "0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000f4240"; + Assert.assertEquals(expectedData, constractData(functionSelector, parameter)); + } + @Test public void testGetEnergyPrice() { String energyPriceHistory = From e0267a6007d2522ebe735664076c052b90972dba Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Mon, 30 Aug 2021 13:45:20 +0800 Subject: [PATCH 173/341] typo --- .../java/org/tron/core/services/jsonrpc/CallArguments.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/CallArguments.java b/framework/src/main/java/org/tron/core/services/jsonrpc/CallArguments.java index 084c7b3382a..c5232169545 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/CallArguments.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/CallArguments.java @@ -26,9 +26,9 @@ public class CallArguments { public String to; public String gas = ""; //not used public String gasPrice = ""; //not used - public String value = ""; //not used + public String value = ""; public String data; - public String nonce; + public String nonce; // not used /** * just support TransferContract and TriggerSmartContract From 82a6c97366e3233088071bbcd88d210066043ca0 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Mon, 30 Aug 2021 13:46:55 +0800 Subject: [PATCH 174/341] typo --- .../java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index e0995721459..01ef81dcde9 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -598,7 +598,6 @@ public String getCall(CallArguments transactionCall, String blockNumOrTag) || "pending".equalsIgnoreCase(blockNumOrTag)) { throw new JsonRpcInvalidParamsException("TAG [earliest | pending] not supported"); } else if ("latest".equalsIgnoreCase(blockNumOrTag)) { - //静态调用合约方法。 byte[] addressData = addressHashToByteArray(transactionCall.from); byte[] contractAddressData = addressHashToByteArray(transactionCall.to); From dff97838ab37d242188982e3b96319d921b9df60 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Mon, 30 Aug 2021 13:59:30 +0800 Subject: [PATCH 175/341] feat: set default result of call to 0x --- .../java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 01ef81dcde9..d4f14539b04 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -345,7 +345,7 @@ private String call(byte[] ownerAddressByte, byte[] contractAddressByte, byte[] trxExt = trxExtBuilder.build(); } - String result = null; + String result = "0x"; String code = trxExt.getResult().getCode().toString(); if ("SUCCESS".equals(code)) { List list = trxExt.getConstantResultList(); From d1e1b6e0928e2a4c38fb01f2c6169a4030a6e494 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Mon, 30 Aug 2021 14:50:50 +0800 Subject: [PATCH 176/341] typo: remove unused codes --- .../core/services/jsonrpc/JsonRpcApiUtil.java | 65 ------------------- 1 file changed, 65 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index 33a0ee0dba1..3315ba97817 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -4,7 +4,6 @@ import com.google.common.primitives.Longs; import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -16,14 +15,12 @@ import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.ByteArray; import org.tron.common.utils.ByteUtil; -import org.tron.common.utils.Commons; import org.tron.common.utils.DecodeUtil; import org.tron.common.utils.Sha256Hash; import org.tron.common.utils.StringUtil; import org.tron.core.Wallet; import org.tron.core.capsule.ContractCapsule; import org.tron.core.exception.JsonRpcInvalidParamsException; -import org.tron.core.exception.TronException; import org.tron.protos.Protocol.Block; import org.tron.protos.Protocol.Transaction; import org.tron.protos.Protocol.Transaction.Contract.ContractType; @@ -52,68 +49,6 @@ @Slf4j(topic = "API") public class JsonRpcApiUtil { - - // transform the Tron address to Ethereum Address - public static String tronToEthAddress(String tronAddress) { - byte[] tronBytes = Commons.decodeFromBase58Check(tronAddress); - byte[] ethBytes = new byte[20]; - try { - if ((tronBytes.length != 21 && tronBytes[0] != Wallet.getAddressPreFixByte())) { - throw new TronException("invalid Tron address"); - } - System.arraycopy(tronBytes, 1, ethBytes, 0, 20); - return toChecksumAddress(ByteArray.toHexString(ethBytes)); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - // transform the Ethereum address to Tron Address - public static String ethToTronAddress(String ethAddress) { - byte[] address = ByteArray.fromHexString(ethAddress); - byte[] tronAddress = new byte[21]; - try { - if (address.length != 20) { - throw new TronException("invalid Ethereum address"); - } - System.arraycopy(address, 0, tronAddress, 1, 20); - tronAddress[0] = Wallet.getAddressPreFixByte(); - return StringUtil.encode58Check(tronAddress); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //reference: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-55.md - private static String toChecksumAddress(String address) throws TronException { - StringBuffer sb = new StringBuffer(); - int nibble; - - if (address.startsWith("0x")) { - address = address.substring(2); - } - String hashedAddress = ByteArray - .toHexString(Hash.sha3(address.getBytes(StandardCharsets.UTF_8))); - sb.append("0x"); - for (int i = 0; i < address.length(); i++) { - if ("0123456789".contains(String.valueOf(address.charAt(i)))) { - sb.append(address.charAt(i)); - } else if ("abcdef".contains(String.valueOf(address.charAt(i)))) { - nibble = Integer.parseInt(String.valueOf(hashedAddress.charAt(i)), 16); - if (nibble > 7) { - sb.append(String.valueOf(address.charAt(i)).toUpperCase()); - } else { - sb.append(address.charAt(i)); - } - } else { - throw new TronException("invalid hex character in address"); - } - } - return sb.toString(); - } - public static byte[] convertToTronAddress(byte[] address) { byte[] newAddress = new byte[21]; byte[] temp = new byte[] {Wallet.getAddressPreFixByte()}; From 0597ed7f1fc5f3b05d6be943a910aeb63236cbb4 Mon Sep 17 00:00:00 2001 From: vikingzzu Date: Mon, 30 Aug 2021 14:56:52 +0800 Subject: [PATCH 177/341] add logback shutdown hock --- .../common/application/ApplicationImpl.java | 2 + .../tron/core/config/TronLogShutdownHook.java | 42 +++++++++++++++++++ .../main/java/org/tron/program/FullNode.java | 2 + framework/src/main/resources/logback.xml | 2 +- 4 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 framework/src/main/java/org/tron/core/config/TronLogShutdownHook.java diff --git a/framework/src/main/java/org/tron/common/application/ApplicationImpl.java b/framework/src/main/java/org/tron/common/application/ApplicationImpl.java index edeadb4432b..8e80a568a96 100644 --- a/framework/src/main/java/org/tron/common/application/ApplicationImpl.java +++ b/framework/src/main/java/org/tron/common/application/ApplicationImpl.java @@ -11,6 +11,7 @@ import org.tron.core.db.Manager; import org.tron.core.metrics.MetricsUtil; import org.tron.core.net.TronNetService; +import org.tron.program.FullNode; @Slf4j(topic = "app") @Component @@ -73,6 +74,7 @@ public void shutdown() { dbManager.stopRePushTriggerThread(); EventPluginLoader.getInstance().stopPlugin(); logger.info("******** end to shutdown ********"); + FullNode.shutDownSign = true; } @Override diff --git a/framework/src/main/java/org/tron/core/config/TronLogShutdownHook.java b/framework/src/main/java/org/tron/core/config/TronLogShutdownHook.java new file mode 100644 index 00000000000..512ecf3ab62 --- /dev/null +++ b/framework/src/main/java/org/tron/core/config/TronLogShutdownHook.java @@ -0,0 +1,42 @@ +package org.tron.core.config; + +import ch.qos.logback.core.hook.ShutdownHookBase; +import ch.qos.logback.core.util.Duration; +import org.tron.program.FullNode; + +/** + * @author kiven + * tron log shutdown hock + */ +public class TronLogShutdownHook extends ShutdownHookBase { + + /** + * The default shutdown delay check unit. + */ + private static final Duration CHECK_SHUTDOWN_DELAY = Duration.buildByMilliseconds(100); + + /** + * The check times before shutdown. default is 50 + */ + private Integer check_times = 50; + + public TronLogShutdownHook() { + } + + @Override + public void run() { + try { + for (int i = 0; i < check_times; i++) { + if (FullNode.shutDownSign) { + break; + } + addInfo("Sleeping for " + CHECK_SHUTDOWN_DELAY); + Thread.sleep(CHECK_SHUTDOWN_DELAY.getMilliseconds()); + } + } catch (InterruptedException e) { + addInfo("TronLogShutdownHook run error :" + e.getMessage()); + } + super.stop(); + } + +} diff --git a/framework/src/main/java/org/tron/program/FullNode.java b/framework/src/main/java/org/tron/program/FullNode.java index 3d3d0f9bd8e..3bd9410168a 100644 --- a/framework/src/main/java/org/tron/program/FullNode.java +++ b/framework/src/main/java/org/tron/program/FullNode.java @@ -25,6 +25,8 @@ public class FullNode { public static final int dbVersion = 2; + public static volatile boolean shutDownSign = false; + public static void load(String path) { try { File file = new File(path); diff --git a/framework/src/main/resources/logback.xml b/framework/src/main/resources/logback.xml index ec2d2b3c1c9..fcdb7ffd16e 100644 --- a/framework/src/main/resources/logback.xml +++ b/framework/src/main/resources/logback.xml @@ -3,7 +3,7 @@ - + From 33ba890eb98602fdd0be12e90df5620950fa0fb7 Mon Sep 17 00:00:00 2001 From: Asuka Date: Mon, 30 Aug 2021 17:51:51 +0800 Subject: [PATCH 178/341] test(tvm): retry Create2Test if out of time --- .../test/java/org/tron/common/runtime/vm/Create2Test.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/framework/src/test/java/org/tron/common/runtime/vm/Create2Test.java b/framework/src/test/java/org/tron/common/runtime/vm/Create2Test.java index f44a19b3737..0baccf9e045 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/Create2Test.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/Create2Test.java @@ -143,7 +143,10 @@ public void testCreate2() contractName, address, abi, factoryCode, value, fee, consumeUserResourcePercent, null); byte[] factoryAddress = WalletUtil.generateContractAddress(trx); - runtime = TvmTestUtils.processTransactionAndReturnRuntime(trx, rootDeposit, null); + for (int i = 0; i < 3; i++) { + runtime = TvmTestUtils.processTransactionAndReturnRuntime(trx, rootDeposit, null); + if (runtime.getRuntimeError() == null) break; + } Assert.assertNull(runtime.getRuntimeError()); // Trigger contract method: deploy(bytes,uint) From e91d6e0eceffe3b819c9653302fc24c9dfecc882 Mon Sep 17 00:00:00 2001 From: daxinzang1 <280474930@qq.com> Date: Mon, 30 Aug 2021 17:55:45 +0800 Subject: [PATCH 179/341] Stest assert adapt 4.4.0 --- .../assetmarket/MarketSellAsset001.java | 14 +++++++------- .../tvmnewcommand/clearabi/ClearAbi001.java | 8 ++++---- .../tvmnewcommand/clearabi/ClearAbi004.java | 2 +- .../tvmnewcommand/clearabi/ClearAbi006.java | 2 +- .../tvmnewcommand/clearabi/ClearAbi007.java | 4 ++-- .../tvmnewcommand/create2/Create2Test019.java | 2 +- .../ContractTestSendCoin001.java | 18 +++++++++--------- 7 files changed, 25 insertions(+), 25 deletions(-) diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/assetmarket/MarketSellAsset001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/assetmarket/MarketSellAsset001.java index 55c11bb04c3..16eb4ae33e4 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/assetmarket/MarketSellAsset001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/assetmarket/MarketSellAsset001.java @@ -148,14 +148,14 @@ void marketSellAssetTest002() { .marketSellAssetGetResposne(testAddress, testKey, assetAccountId001, sellTokenQuantity, assetAccountId002, buyTokenQuantity, blockingStubFull); Assert.assertEquals(ByteArray.toStr(resposne.getMessage().toByteArray()), - "contract validate error : SellToken balance is not enough !"); + "Contract validate error : SellToken balance is not enough !"); Assert.assertEquals(resposne.getCode(), response_code.CONTRACT_VALIDATE_ERROR); resposne = PublicMethed .marketSellAssetGetResposne(testAddress, testKey, assetAccountId001, 0, assetAccountId002, buyTokenQuantity, blockingStubFull); Assert.assertEquals(ByteArray.toStr(resposne.getMessage().toByteArray()), - "contract validate error : token quantity must greater than zero"); + "Contract validate error : token quantity must greater than zero"); Assert.assertEquals(resposne.getCode(), response_code.CONTRACT_VALIDATE_ERROR); Account account = PublicMethed @@ -174,35 +174,35 @@ void marketSellAssetTest003() { .marketSellAssetGetResposne(testAddress001, testKey001, "xxxx".getBytes(), sellTokenQuantity, assetAccountId002, buyTokenQuantity, blockingStubFull); Assert.assertEquals(ByteArray.toStr(resposne.getMessage().toByteArray()), - "contract validate error : sellTokenId is not a valid number"); + "Contract validate error : sellTokenId is not a valid number"); Assert.assertEquals(resposne.getCode(), response_code.CONTRACT_VALIDATE_ERROR); resposne = PublicMethed .marketSellAssetGetResposne(testAddress001, testKey001, assetAccountId001, sellTokenQuantity, "xxx".getBytes(), buyTokenQuantity, blockingStubFull); Assert.assertEquals(ByteArray.toStr(resposne.getMessage().toByteArray()), - "contract validate error : buyTokenId is not a valid number"); + "Contract validate error : buyTokenId is not a valid number"); Assert.assertEquals(resposne.getCode(), response_code.CONTRACT_VALIDATE_ERROR); resposne = PublicMethed .marketSellAssetGetResposne(testAddress001, testKey001, "10001039999".getBytes(), sellTokenQuantity, assetAccountId002, buyTokenQuantity, blockingStubFull); Assert.assertEquals(ByteArray.toStr(resposne.getMessage().toByteArray()), - "contract validate error : No sellTokenId !"); + "Contract validate error : No sellTokenId !"); Assert.assertEquals(resposne.getCode(), response_code.CONTRACT_VALIDATE_ERROR); resposne = PublicMethed .marketSellAssetGetResposne(testAddress001, testKey001, assetAccountId001, sellTokenQuantity, "10001039999".getBytes(), buyTokenQuantity, blockingStubFull); Assert.assertEquals(ByteArray.toStr(resposne.getMessage().toByteArray()), - "contract validate error : No buyTokenId !"); + "Contract validate error : No buyTokenId !"); Assert.assertEquals(resposne.getCode(), response_code.CONTRACT_VALIDATE_ERROR); resposne = PublicMethed .marketSellAssetGetResposne(testAddress001, testKey001, assetAccountId001, sellTokenQuantity, assetAccountId001, buyTokenQuantity, blockingStubFull); Assert.assertEquals(ByteArray.toStr(resposne.getMessage().toByteArray()), - "contract validate error : cannot exchange same tokens"); + "Contract validate error : cannot exchange same tokens"); Assert.assertEquals(resposne.getCode(), response_code.CONTRACT_VALIDATE_ERROR); long afterBalance = PublicMethed.queryAccount(testAddress002, blockingStubFull).getBalance(); diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/clearabi/ClearAbi001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/clearabi/ClearAbi001.java index 9da1f2b3227..5e90c5ca4cb 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/clearabi/ClearAbi001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/clearabi/ClearAbi001.java @@ -234,7 +234,7 @@ public void testClearAbi004() { containsString("CONTRACT_VALIDATE_ERROR")); Assert .assertThat(transactionExtention.getResult().getMessage().toStringUtf8(), - containsString("contract validate error : Contract not exists")); + containsString("Contract validate error : Contract not exists")); } @@ -251,7 +251,7 @@ public void testClearAbi005() { Assert.assertThat(transactionExtention.getResult().getCode().toString(), containsString("CONTRACT_VALIDATE_ERROR")); Assert.assertThat(transactionExtention.getResult().getMessage().toStringUtf8(), - containsString("contract validate error : Contract not exists")); + containsString("Contract validate error : Contract not exists")); } @@ -266,7 +266,7 @@ public void testClearAbi006() { containsString("CONTRACT_VALIDATE_ERROR")); Assert .assertThat(transactionExtention.getResult().getMessage().toStringUtf8(), - containsString("contract validate error : Contract not exists")); + containsString("Contract validate error : Contract not exists")); byte[] fakeAddress1 = "412B5D3405B2D26767C9C09886D53DEAFF6EB718AC111".getBytes(); TransactionExtention transactionExtention1 = PublicMethed @@ -277,7 +277,7 @@ public void testClearAbi006() { containsString("CONTRACT_VALIDATE_ERROR")); Assert .assertThat(transactionExtention1.getResult().getMessage().toStringUtf8(), - containsString("contract validate error : Contract not exists")); + containsString("Contract validate error : Contract not exists")); } diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/clearabi/ClearAbi004.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/clearabi/ClearAbi004.java index a7593980fe5..84d4a1531b6 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/clearabi/ClearAbi004.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/clearabi/ClearAbi004.java @@ -91,7 +91,7 @@ public void testClearAbi() { containsString("CONTRACT_VALIDATE_ERROR")); Assert .assertThat(transactionExtention.getResult().getMessage().toStringUtf8(), - containsString("contract validate error : Contract not exists")); + containsString("Contract validate error : Contract not exists")); } diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/clearabi/ClearAbi006.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/clearabi/ClearAbi006.java index dc7a211b21a..0a8b65a2232 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/clearabi/ClearAbi006.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/clearabi/ClearAbi006.java @@ -92,7 +92,7 @@ public void testClearAbi() { Assert.assertThat(transactionExtention.getResult().getCode().toString(), containsString("CONTRACT_VALIDATE_ERROR")); Assert.assertThat(transactionExtention.getResult().getMessage().toStringUtf8(), - containsString("contract validate error : Contract not exists")); + containsString("Contract validate error : Contract not exists")); } diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/clearabi/ClearAbi007.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/clearabi/ClearAbi007.java index 2e323a1251f..d3b5c957397 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/clearabi/ClearAbi007.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/clearabi/ClearAbi007.java @@ -94,7 +94,7 @@ public void testClearAbi() { containsString("CONTRACT_VALIDATE_ERROR")); Assert .assertThat(transactionExtention.getResult().getMessage().toStringUtf8(), - containsString("contract validate error : Contract not exists")); + containsString("Contract validate error : Contract not exists")); byte[] fakeAddress1 = "412B5D3405B2D26767C9C09886D53DEAFF6EB718AC111".getBytes(); TransactionExtention transactionExtention1 = PublicMethed @@ -105,7 +105,7 @@ public void testClearAbi() { containsString("CONTRACT_VALIDATE_ERROR")); Assert .assertThat(transactionExtention1.getResult().getMessage().toStringUtf8(), - containsString("contract validate error : Contract not exists")); + containsString("Contract validate error : Contract not exists")); } diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/create2/Create2Test019.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/create2/Create2Test019.java index a7281fcf74d..0785bce1985 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/create2/Create2Test019.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/create2/Create2Test019.java @@ -253,7 +253,7 @@ public void testTriggerContract() { containsString("CONTRACT_VALIDATE_ERROR")); Assert .assertThat(transactionExtention.getResult().getMessage().toStringUtf8(), - containsString("contract validate error : No contract or not a valid smart contract")); + containsString("Contract validate error : No contract or not a valid smart contract")); txid = PublicMethed .triggerContract(contractAddress, diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/transferfailed/ContractTestSendCoin001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/transferfailed/ContractTestSendCoin001.java index 58222f029b9..59cf22a7d43 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/transferfailed/ContractTestSendCoin001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/transferfailed/ContractTestSendCoin001.java @@ -181,7 +181,7 @@ public void testSendCoinAndTransferAssetContract001() { dev001Address, dev001Key, blockingStubFull); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, ret.getCode()); - Assert.assertEquals("contract validate error : Cannot transfer asset to smartContract.", + Assert.assertEquals("Contract validate error : Cannot transfer asset to smartContract.", ret.getMessage().toStringUtf8()); Long contractAssetCount = PublicMethed .getAssetIssueValue(transferTokenContractAddress, assetAccountId, blockingStubFull); @@ -194,7 +194,7 @@ public void testSendCoinAndTransferAssetContract001() { .sendcoinForReturn(transferTokenContractAddress, 1_000_000L, fromAddress, testKey002, blockingStubFull); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, ret1.getCode()); - Assert.assertEquals("contract validate error : Cannot transfer TRX to a smartContract.", + Assert.assertEquals("Contract validate error : Cannot transfer TRX to a smartContract.", ret1.getMessage().toStringUtf8()); String num = "\"" + Base58.encode58Check(dev001Address) + "\""; @@ -328,7 +328,7 @@ public void testSendCoinAndTransferAssetContract002() { dev001Address, dev001Key, blockingStubFull); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, ret.getCode()); - Assert.assertEquals("contract validate error : Cannot transfer asset to smartContract.", + Assert.assertEquals("Contract validate error : Cannot transfer asset to smartContract.", ret.getMessage().toStringUtf8()); Long contractAssetCount = PublicMethed .getAssetIssueValue(testContractAddress, assetAccountId, blockingStubFull); @@ -341,7 +341,7 @@ public void testSendCoinAndTransferAssetContract002() { .sendcoinForReturn(testContractAddress, 1_000_000L, fromAddress, testKey002, blockingStubFull); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, ret1.getCode()); - Assert.assertEquals("contract validate error : Cannot transfer TRX to a smartContract.", + Assert.assertEquals("Contract validate error : Cannot transfer TRX to a smartContract.", ret1.getMessage().toStringUtf8()); String num = "\"" + Base58.encode58Check(dev001Address) + "\""; @@ -478,7 +478,7 @@ public void testSendCoinAndTransferAssetContract003() { dev001Address, dev001Key, blockingStubFull); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, ret.getCode()); - Assert.assertEquals("contract validate error : Cannot transfer asset to smartContract.", + Assert.assertEquals("Contract validate error : Cannot transfer asset to smartContract.", ret.getMessage().toStringUtf8()); Return ret1 = PublicMethed @@ -486,7 +486,7 @@ public void testSendCoinAndTransferAssetContract003() { dev001Address, dev001Key, blockingStubFull); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, ret1.getCode()); - Assert.assertEquals("contract validate error : Cannot transfer asset to smartContract.", + Assert.assertEquals("Contract validate error : Cannot transfer asset to smartContract.", ret1.getMessage().toStringUtf8()); txid = PublicMethed @@ -557,7 +557,7 @@ public void testSendCoinAndTransferAssetContract003() { Assert.assertThat(transactionExtention.getResult().getCode().toString(), containsString("CONTRACT_VALIDATE_ERROR")); Assert.assertThat(transactionExtention.getResult().getMessage().toStringUtf8(), - containsString("contract validate error : No contract or not a valid smart contract")); + containsString("Contract validate error : No contract or not a valid smart contract")); Assert.assertTrue(PublicMethed .transferAsset(returnAddressBytes, assetAccountId.toByteArray(), 100L, dev001Address, @@ -592,7 +592,7 @@ public void testSendCoinAndTransferAssetContract003() { dev001Address, dev001Key, blockingStubFull); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, ret.getCode()); - Assert.assertEquals("contract validate error : Cannot transfer asset to smartContract.", + Assert.assertEquals("Contract validate error : Cannot transfer asset to smartContract.", ret.getMessage().toStringUtf8()); ret1 = PublicMethed @@ -600,7 +600,7 @@ public void testSendCoinAndTransferAssetContract003() { dev001Address, dev001Key, blockingStubFull); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, ret1.getCode()); - Assert.assertEquals("contract validate error : Cannot transfer asset to smartContract.", + Assert.assertEquals("Contract validate error : Cannot transfer asset to smartContract.", ret1.getMessage().toStringUtf8()); } From 7caa0899a36df9646e53eedf8655663f3213ff19 Mon Sep 17 00:00:00 2001 From: Asuka Date: Tue, 31 Aug 2021 09:56:42 +0800 Subject: [PATCH 180/341] style(test): fix checkstyle --- .../src/test/java/org/tron/common/runtime/vm/Create2Test.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/framework/src/test/java/org/tron/common/runtime/vm/Create2Test.java b/framework/src/test/java/org/tron/common/runtime/vm/Create2Test.java index 0baccf9e045..9b470f2df50 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/Create2Test.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/Create2Test.java @@ -145,7 +145,9 @@ public void testCreate2() byte[] factoryAddress = WalletUtil.generateContractAddress(trx); for (int i = 0; i < 3; i++) { runtime = TvmTestUtils.processTransactionAndReturnRuntime(trx, rootDeposit, null); - if (runtime.getRuntimeError() == null) break; + if (runtime.getRuntimeError() == null) { + break; + } } Assert.assertNull(runtime.getRuntimeError()); From 6c7284543ceaff528ba49b599fb39b86029f6d28 Mon Sep 17 00:00:00 2001 From: neo hong Date: Tue, 31 Aug 2021 10:57:34 +0800 Subject: [PATCH 181/341] optimize code --- .../org/tron/core/actuator/VMActuator.java | 12 ++--- .../org/tron/core/utils/ProposalUtil.java | 52 +++++++++---------- .../tron/core/vm/PrecompiledContracts.java | 6 +-- .../src/main/java/org/tron/core/vm/VM.java | 27 ++++++++-- .../org/tron/core/vm/config/VMConfig.java | 4 +- .../org/tron/core/vm/program/Program.java | 35 +++++++++---- .../java/org/tron/core/config/Parameter.java | 3 +- .../org/tron/common/runtime/RuntimeImpl.java | 4 ++ .../src/main/java/org/tron/core/Wallet.java | 14 ++--- protocol/src/main/protos/core/Tron.proto | 1 + 10 files changed, 100 insertions(+), 58 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/actuator/VMActuator.java b/actuator/src/main/java/org/tron/core/actuator/VMActuator.java index 0dafcbf5709..55a333ae3ce 100644 --- a/actuator/src/main/java/org/tron/core/actuator/VMActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/VMActuator.java @@ -188,11 +188,10 @@ public void execute(Object object) throws ContractExeException { if (TrxType.TRX_CONTRACT_CREATION_TYPE == trxType && !result.isRevert()) { byte[] code = program.getResult().getHReturn(); - if (vmConfig.allowTvmLondon() && code[0] == (byte) 0xEF) { - // todo deal with exception + if (code.length != 0 && vmConfig.allowTvmLondon() && code[0] == (byte) 0xEF) { if (null == result.getException()) { result.setException(Program.Exception - .invalidOpCode((byte) 0xEF)); + .invalidCodeException()); } } long saveCodeEnergy = (long) getLength(code) * EnergyCost.getInstance().getCREATE_DATA(); @@ -297,9 +296,11 @@ private void create() if (contract == null) { throw new ContractValidateException("Cannot get CreateSmartContract from transaction"); } - SmartContract newSmartContract = contract.getNewContract(); + SmartContract newSmartContract; if (VMConfig.allowTvmCompatibleEvm()) { newSmartContract = contract.getNewContract().toBuilder().setVersion(1).build(); + } else { + newSmartContract = contract.getNewContract().toBuilder().clearVersion().build(); } if (!contract.getOwnerAddress().equals(newSmartContract.getOriginAddress())) { logger.info("OwnerAddress not equals OriginAddress"); @@ -488,8 +489,7 @@ private void call() rootInternalTransaction = new InternalTransaction(trx, trxType); this.program = new Program(code, programInvoke, rootInternalTransaction, vmConfig); if (VMConfig.allowTvmCompatibleEvm()) { - this.program.setContractVersion( - repository.getContract(contractAddress).getContractVersion()); + this.program.setContractVersion(deployedContract.getContractVersion()); } byte[] txId = TransactionUtil.getTransactionId(trx).getBytes(); this.program.setRootTransactionId(txId); diff --git a/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java b/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java index aefc02db33a..8ce040702c5 100644 --- a/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java +++ b/actuator/src/main/java/org/tron/core/utils/ProposalUtil.java @@ -477,30 +477,6 @@ public static void validator(DynamicPropertiesStore dynamicPropertiesStore, } break; } - case ALLOW_TVM_LONDON: { - // todo version modify - // if (!forkController.pass(ForkBlockVersionEnum.VERSION_4_3)) { - // throw new ContractValidateException( - // "Bad chain parameter id [ALLOW_TVM_LONDON]"); - // } - if (value != 1) { - throw new ContractValidateException( - "This value[ALLOW_TVM_LONDON] is only allowed to be 1"); - } - break; - } - case ALLOW_TVM_COMPATIBLE_EVM: { - // todo version modify - // if (!forkController.pass(ForkBlockVersionEnum.VERSION_4_3)) { - // throw new ContractValidateException( - // "Bad chain parameter id [ALLOW_TVM_COMPATIBLE_EVM]"); - // } - if (value != 1) { - throw new ContractValidateException( - "This value[ALLOW_TVM_COMPATIBLE_EVM] is only allowed to be 1"); - } - break; - } case FREE_NET_LIMIT: { if (!forkController.pass(ForkBlockVersionEnum.VERSION_4_3)) { throw new ContractValidateException("Bad chain parameter id [FREE_NET_LIMIT]"); @@ -533,6 +509,28 @@ public static void validator(DynamicPropertiesStore dynamicPropertiesStore, } break; } + case ALLOW_TVM_LONDON: { + if (!forkController.pass(ForkBlockVersionEnum.VERSION_4_4)) { + throw new ContractValidateException( + "Bad chain parameter id [ALLOW_TVM_LONDON]"); + } + if (value != 1) { + throw new ContractValidateException( + "This value[ALLOW_TVM_LONDON] is only allowed to be 1"); + } + break; + } + case ALLOW_TVM_COMPATIBLE_EVM: { + if (!forkController.pass(ForkBlockVersionEnum.VERSION_4_4)) { + throw new ContractValidateException( + "Bad chain parameter id [ALLOW_TVM_COMPATIBLE_EVM]"); + } + if (value != 1) { + throw new ContractValidateException( + "This value[ALLOW_TVM_COMPATIBLE_EVM] is only allowed to be 1"); + } + break; + } default: break; } @@ -583,7 +581,7 @@ public enum ProposalType { // current value, value range ALLOW_MARKET_TRANSACTION(44), // {0, 1} MARKET_SELL_FEE(45), // 0 [0,10_000_000_000] MARKET_CANCEL_FEE(46), // 0 [0,10_000_000_000] - MAX_FEE_LIMIT(47), // [0, 10_000_000_000] + MAX_FEE_LIMIT(47), // [0, 100_000_000_000] TRX ALLOW_TRANSACTION_FEE_POOL(48), // 0, 1 ALLOW_BLACKHOLE_OPTIMIZATION(49),// 0,1 ALLOW_NEW_RESOURCE_MODEL(51),// 0,1 @@ -591,10 +589,10 @@ public enum ProposalType { // current value, value range ALLOW_ACCOUNT_ASSET_OPTIMIZATION(53), // 1 // ALLOW_NEW_REWARD_ALGORITHM(58), // 0, 1 ALLOW_TVM_VOTE(59), // 0, 1 - ALLOW_TVM_COMPATIBLE_EVM(60), + ALLOW_TVM_COMPATIBLE_EVM(60), // 0, 1 FREE_NET_LIMIT(61), // 5000, [0, 100_000] TOTAL_NET_LIMIT(62), // 43_200_000_000L, [0, 1000_000_000_000L] - ALLOW_TVM_LONDON(63); + ALLOW_TVM_LONDON(63); // 0, 1 private long code; diff --git a/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java b/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java index 4e26445de18..7043bf6663d 100644 --- a/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java +++ b/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java @@ -1783,11 +1783,11 @@ public Pair execute(byte[] data) { if (data.length != 213) { logger.info("Incorrect input length. Expected {} and got {}", 213, data.length); - return Pair.of(true, DataWord.ZERO().getData()); + return Pair.of(false, DataWord.ZERO().getData()); } if ((data[212] & 0xFE) != 0) { logger.info("Incorrect finalization flag, expected 0 or 1 and got {}", data[212]); - return Pair.of(true, DataWord.ZERO().getData()); + return Pair.of(false, DataWord.ZERO().getData()); } final MessageDigest digest = new Blake2bfMessageDigest(); byte[] result; @@ -1795,7 +1795,7 @@ public Pair execute(byte[] data) { digest.update(data); result = digest.digest(); } catch (Exception e) { - return Pair.of(true, new DataWord(EMPTY_BYTE_ARRAY).getData()); + return Pair.of(true, EMPTY_BYTE_ARRAY); } return Pair.of(true, result); } diff --git a/actuator/src/main/java/org/tron/core/vm/VM.java b/actuator/src/main/java/org/tron/core/vm/VM.java index fc5e4a7d463..b3b7e1c40da 100644 --- a/actuator/src/main/java/org/tron/core/vm/VM.java +++ b/actuator/src/main/java/org/tron/core/vm/VM.java @@ -3,7 +3,27 @@ import static org.tron.common.crypto.Hash.sha3; import static org.tron.common.utils.ByteUtil.EMPTY_BYTE_ARRAY; import static org.tron.core.db.TransactionTrace.convertToTronAddress; -import static org.tron.core.vm.OpCode.*; +import static org.tron.core.vm.OpCode.CALL; +import static org.tron.core.vm.OpCode.CALLTOKEN; +import static org.tron.core.vm.OpCode.CALLTOKENID; +import static org.tron.core.vm.OpCode.CALLTOKENVALUE; +import static org.tron.core.vm.OpCode.CHAINID; +import static org.tron.core.vm.OpCode.CREATE2; +import static org.tron.core.vm.OpCode.EXTCODEHASH; +import static org.tron.core.vm.OpCode.FREEZE; +import static org.tron.core.vm.OpCode.FREEZEEXPIRETIME; +import static org.tron.core.vm.OpCode.ISCONTRACT; +import static org.tron.core.vm.OpCode.PUSH1; +import static org.tron.core.vm.OpCode.REVERT; +import static org.tron.core.vm.OpCode.SAR; +import static org.tron.core.vm.OpCode.SELFBALANCE; +import static org.tron.core.vm.OpCode.SHL; +import static org.tron.core.vm.OpCode.SHR; +import static org.tron.core.vm.OpCode.TOKENBALANCE; +import static org.tron.core.vm.OpCode.UNFREEZE; +import static org.tron.core.vm.OpCode.VOTEWITNESS; +import static org.tron.core.vm.OpCode.WITHDRAWREWARD; +import static org.tron.core.vm.OpCode.BASEFEE; import java.math.BigInteger; import java.util.ArrayList; @@ -100,8 +120,7 @@ public void step(Program program) { && (op == FREEZE || op == UNFREEZE || op == FREEZEEXPIRETIME)) || (!VMConfig.allowTvmVote() && (op == VOTEWITNESS || op == WITHDRAWREWARD)) - || (!VMConfig.allowTvmLondon() - && (op == BASEFEE)) + || (!VMConfig.allowTvmLondon() && (op == BASEFEE)) ) { throw Program.Exception.invalidOpCode(program.getCurrentOp()); } @@ -812,7 +831,7 @@ && isDeadAccount(program, callAddressWord) break; case GASPRICE: { DataWord energyPrice = new DataWord(0); - if (program.getContractVersion() == 1) { + if (VMConfig.allowTvmCompatibleEvm() && program.getContractVersion() == 1) { energyPrice = new DataWord(program.getContractState() .getDynamicPropertiesStore().getEnergyFee()); } diff --git a/actuator/src/main/java/org/tron/core/vm/config/VMConfig.java b/actuator/src/main/java/org/tron/core/vm/config/VMConfig.java index d0447c9c83d..9d4b9ab27c9 100644 --- a/actuator/src/main/java/org/tron/core/vm/config/VMConfig.java +++ b/actuator/src/main/java/org/tron/core/vm/config/VMConfig.java @@ -138,7 +138,9 @@ public static boolean allowShieldedTRC20Transaction() { return ALLOW_SHIELDED_TRC20_TRANSACTION; } - public static boolean allowTvmIstanbul() {return ALLOW_TVM_ISTANBUL; } + public static boolean allowTvmIstanbul() { + return ALLOW_TVM_ISTANBUL; + } public static boolean allowTvmFreeze() { return ALLOW_TVM_FREEZE; diff --git a/actuator/src/main/java/org/tron/core/vm/program/Program.java b/actuator/src/main/java/org/tron/core/vm/program/Program.java index 25d0e31c57b..4de24d7cf4d 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/Program.java +++ b/actuator/src/main/java/org/tron/core/vm/program/Program.java @@ -25,7 +25,6 @@ import static org.apache.commons.lang3.ArrayUtils.isEmpty; import static org.apache.commons.lang3.ArrayUtils.isNotEmpty; import static org.apache.commons.lang3.ArrayUtils.nullToEmpty; -import static org.tron.common.utils.ByteUtil.intToBytes; import static org.tron.common.utils.ByteUtil.stripLeadingZeroes; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; @@ -728,8 +727,8 @@ private void createContractImpl(DataWord value, byte[] programCode, byte[] newAd if (!contractAlreadyExists) { Builder builder = SmartContract.newBuilder(); - if (getContractVersion() == 1) { - builder.setVersion(1); + if (VMConfig.allowTvmCompatibleEvm()) { + builder.setVersion(getContractVersion()); } builder.setContractAddress(ByteString.copyFrom(newAddress)) .setConsumeUserResourcePercent(100) @@ -744,8 +743,8 @@ private void createContractImpl(DataWord value, byte[] programCode, byte[] newAd deposit.createAccount(newAddress, "CreatedByContract", Protocol.AccountType.Contract); Builder builder = SmartContract.newBuilder(); - if (getContractVersion() == 1) { - builder.setVersion(1); + if (VMConfig.allowTvmCompatibleEvm()) { + builder.setVersion(getContractVersion()); } SmartContract newSmartContract = builder.setContractAddress(ByteString.copyFrom(newAddress)) .setConsumeUserResourcePercent(100) @@ -797,7 +796,7 @@ this, new DataWord(newAddress), getContractAddress(), value, new DataWord(0), Program program = new Program(programCode, programInvoke, internalTx, config); program.setRootTransactionId(this.rootTransactionId); if (VMConfig.allowTvmCompatibleEvm()) { - program.setContractVersion(this.contractVersion); + program.setContractVersion(getContractVersion()); } vm.play(program); createResult = program.getResult(); @@ -811,9 +810,8 @@ this, new DataWord(newAddress), getContractAddress(), value, new DataWord(0), byte[] code = createResult.getHReturn(); if (code.length != 0 && config.allowTvmLondon() && code[0] == (byte) 0xEF) { - // todo dealwith exception - createResult.setException(new BytecodeExecutionException( - "can't create a contract start with 0xef")); + createResult.setException(Program.Exception + .invalidCodeException()); } long saveCodeEnergy = (long) getLength(code) * EnergyCost.getInstance().getCREATE_DATA(); @@ -1687,7 +1685,7 @@ public void checkTokenIdInTokenBalance(DataWord tokenIdDataWord) { } public DataWord getCallEnergy(OpCode op, DataWord requestedEnergy, DataWord availableEnergy) { - if (getContractVersion() == 1) { + if (VMConfig.allowTvmCompatibleEvm() && getContractVersion() == 1) { DataWord availableEnergyReduce = availableEnergy.clone(); availableEnergyReduce.div(new DataWord(64)); availableEnergy.sub(availableEnergyReduce); @@ -1696,6 +1694,11 @@ public DataWord getCallEnergy(OpCode op, DataWord requestedEnergy, DataWord avai } public DataWord getCreateEnergy(DataWord availableEnergy) { + if (VMConfig.allowTvmCompatibleEvm() && getContractVersion() == 1) { + DataWord availableEnergyReduce = availableEnergy.clone(); + availableEnergyReduce.div(new DataWord(64)); + availableEnergy.sub(availableEnergyReduce); + } return availableEnergy; } @@ -2071,6 +2074,14 @@ public IllegalOperationException(String message, Object... args) { } } + @SuppressWarnings("serial") + public static class InvalidCodeException extends BytecodeExecutionException { + + public InvalidCodeException(String message) { + super(message); + } + } + @SuppressWarnings("serial") public static class BadJumpDestinationException extends BytecodeExecutionException { @@ -2177,6 +2188,10 @@ public static IllegalOperationException invalidOpCode(byte... opCode) { Hex.toHexString(opCode, 0, 1)); } + public static InvalidCodeException invalidCodeException() { + return new InvalidCodeException("invalid code: must not begin with 0xef"); + } + public static BadJumpDestinationException badJumpDestination(int pc) { return new BadJumpDestinationException("Operation with pc isn't 'JUMPDEST': PC[%d];", pc); } diff --git a/common/src/main/java/org/tron/core/config/Parameter.java b/common/src/main/java/org/tron/core/config/Parameter.java index b64efb7eb92..6548fd4d2a8 100644 --- a/common/src/main/java/org/tron/core/config/Parameter.java +++ b/common/src/main/java/org/tron/core/config/Parameter.java @@ -16,7 +16,8 @@ public enum ForkBlockVersionEnum { VERSION_4_1(19, 1596780000000L, 80),//GMT 2020-08-07 06:00:00,80 means 22 SR upgrade VERSION_4_1_2(20, 1596780000000L, 80), VERSION_4_2(21, 1596780000000L, 80), - VERSION_4_3(22, 1596780000000L, 80); + VERSION_4_3(22, 1596780000000L, 80), + VERSION_4_4(23, 1596780000000L, 80); @Getter private int value; diff --git a/framework/src/main/java/org/tron/common/runtime/RuntimeImpl.java b/framework/src/main/java/org/tron/common/runtime/RuntimeImpl.java index 041d4a5bc7f..4ba53c7dc92 100644 --- a/framework/src/main/java/org/tron/common/runtime/RuntimeImpl.java +++ b/framework/src/main/java/org/tron/common/runtime/RuntimeImpl.java @@ -131,6 +131,10 @@ private void setResultCode(ProgramResult result) { result.setResultCode(contractResult.TRANSFER_FAILED); return; } + if (exception instanceof Program.InvalidCodeException) { + result.setResultCode(contractResult.INVALID_CODE); + return; + } result.setResultCode(contractResult.UNKNOWN); } diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index f37a6ac1430..9437580b7d1 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -1005,13 +1005,15 @@ public Protocol.ChainParameters getChainParameters() { .setValue(dbManager.getDynamicPropertiesStore().getAllowTvmVote()) .build()); - builder.addChainParameter( - Protocol.ChainParameters.ChainParameter.newBuilder().setKey("getAllowTvmLondon") - .setValue(dbManager.getDynamicPropertiesStore().getAllowTvmLondon()).build()); + builder.addChainParameter(Protocol.ChainParameters.ChainParameter.newBuilder() + .setKey("getAllowTvmLondon") + .setValue(dbManager.getDynamicPropertiesStore().getAllowTvmLondon()) + .build()); - builder.addChainParameter( - Protocol.ChainParameters.ChainParameter.newBuilder().setKey("getAllowTvmCompatibleEvm") - .setValue(dbManager.getDynamicPropertiesStore().getAllowTvmCompatibleEvm()).build()); + builder.addChainParameter(Protocol.ChainParameters.ChainParameter.newBuilder() + .setKey("getAllowTvmCompatibleEvm") + .setValue(dbManager.getDynamicPropertiesStore().getAllowTvmCompatibleEvm()) + .build()); builder.addChainParameter(Protocol.ChainParameters.ChainParameter.newBuilder() .setKey("getAllowAccountAssetOptimization") diff --git a/protocol/src/main/protos/core/Tron.proto b/protocol/src/main/protos/core/Tron.proto index 23bd8840711..a4409923086 100644 --- a/protocol/src/main/protos/core/Tron.proto +++ b/protocol/src/main/protos/core/Tron.proto @@ -405,6 +405,7 @@ message Transaction { JVM_STACK_OVER_FLOW = 12; UNKNOWN = 13; TRANSFER_FAILED = 14; + INVALID_CODE = 15; } int64 fee = 1; code ret = 2; From c3ed8985506e72a789236fe43494cbb2a289326e Mon Sep 17 00:00:00 2001 From: Asuka Date: Tue, 31 Aug 2021 12:15:43 +0800 Subject: [PATCH 182/341] func(tvm): revert uncheck max fee limit --- .../org/tron/core/actuator/VMActuator.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/actuator/VMActuator.java b/actuator/src/main/java/org/tron/core/actuator/VMActuator.java index 55a333ae3ce..e0861d3b77a 100644 --- a/actuator/src/main/java/org/tron/core/actuator/VMActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/VMActuator.java @@ -338,7 +338,12 @@ private void create() byte[] callerAddress = contract.getOwnerAddress().toByteArray(); // create vm to constructor smart contract try { - long feeLimit = checkAndGetFeeLimit(); + long feeLimit = trx.getRawData().getFeeLimit(); + if (feeLimit < 0 || feeLimit > repository.getDynamicPropertiesStore().getMaxFeeLimit()) { + logger.info("invalid feeLimit {}", feeLimit); + throw new ContractValidateException( + "feeLimit must be >= 0 and <= " + repository.getDynamicPropertiesStore().getMaxFeeLimit()); + } AccountCapsule creator = this.repository .getAccount(newSmartContract.getOriginAddress().toByteArray()); @@ -461,7 +466,12 @@ private void call() byte[] code = repository.getCode(contractAddress); if (isNotEmpty(code)) { - long feeLimit = checkAndGetFeeLimit(); + long feeLimit = trx.getRawData().getFeeLimit(); + if (feeLimit < 0 || feeLimit > repository.getDynamicPropertiesStore().getMaxFeeLimit()) { + logger.info("invalid feeLimit {}", feeLimit); + throw new ContractValidateException( + "feeLimit must be >= 0 and <= " + repository.getDynamicPropertiesStore().getMaxFeeLimit()); + } AccountCapsule caller = repository.getAccount(callerAddress); long energyLimit; if (isConstantCall) { @@ -513,16 +523,6 @@ private void call() } - private long checkAndGetFeeLimit() throws ContractValidateException { - long txFeeLimit = trx.getRawData().getFeeLimit(); - if (txFeeLimit < 0) { - logger.info("invalid feeLimit {}", txFeeLimit); - throw new ContractValidateException("feeLimit must be >= 0"); - } - long maxFeeLimit = repository.getDynamicPropertiesStore().getMaxFeeLimit(); - return min(txFeeLimit, maxFeeLimit); - } - public long getAccountEnergyLimitWithFixRatio(AccountCapsule account, long feeLimit, long callValue) { From d14ec79e35950ce1c6db1f2d6499bab07516a443 Mon Sep 17 00:00:00 2001 From: liukai Date: Tue, 31 Aug 2021 14:47:37 +0800 Subject: [PATCH 183/341] add: 1.quickstart.sh modify: 1.optimize the start.sh 2.modify quickstart.md on quickstart.sh Instructions for use --- quickstart.md | 135 ++++++++++++++++++++++++++++++++++++++++++++++++++ quickstart.sh | 65 ++++++++++++++++++++++++ start.sh | 10 ++-- 3 files changed, 205 insertions(+), 5 deletions(-) create mode 100644 quickstart.sh diff --git a/quickstart.md b/quickstart.md index 5359af00060..4e323e7de7b 100644 --- a/quickstart.md +++ b/quickstart.md @@ -239,3 +239,138 @@ docker container kill 513078dc7816 // use your container ID ........ etc ``` + + + +## Set the maximum memory usage of `FullNode.jar` +### Usage + +Get the latest code from github + +``` +sh quickstart.sh -clone +``` + + Clone the latest code from the master branch of https://github.com/tronprotocol/java-tron + +``` +sh quickstart.sh -cb +``` + + Get the latest code from master branch of https://github.com/tronprotocol/java-tron and compileDownload the Latest Release + +``` +sh quickstart.sh -download +``` + +### Download the latest version of the java-tron release +After successful execution, the following files will be automatically downloaded, `start.sh` can be used to start the `FullNode.jar` service + +``` +FullNode-| + \--config.conf + \--FullNode.jar + \--start.sh +``` + +### Start the FullNode.jar via `start.sh` + +Use `-mem` parameter to set the maximum memory usage of `FullNode.jar` + +``` +sh start.sh -mem 12000 +``` + +Physical memory size in MB, here 12000 means 12000MB Start the service with `quickstart.sh` + + + +### Options + +#### quickstart.sh options + +* `-clone` +Clone the latest code for the master branch from`https://github.com/tronprotocol/java-tron` + +* `-download` + + Get the latest version of java-tron distribution quickly + +#### start.sh options +* `-mem` + + Physical memory size in MB + + + +### quickstart.sh + +```shell +#!/bin/bash +START_OPT=$1 +FULL_NODE_DIR="FullNode" +FULL_NODE_VERSION="GreatVoyage-v4.3.0" + +download() { + if [ ! -d "$FULL_NODE_DIR" ]; then + mkdir $FULL_NODE_DIR + cd $FULL_NODE_DIR + elif [ -d "$FULL_NODE_DIR" ]; then + cd $FULL_NODE_DIR + fi + + if type wget >/dev/null 2>&1; then + config_file=$(wget https://raw.githubusercontent.com/tronprotocol/java-tron/develop/framework/src/main/resources/config.conf) + sh_file=$(wget https://raw.githubusercontent.com/tronprotocol/java-tron/develop/start.sh) + full_node=$(wget https://github.com/tronprotocol/java-tron/releases/download/$FULL_NODE_VERSION/FullNode.jar) + + if [[ $full_node == 0 ]]; then + echo 'download FullNode.jar success' + fi + + if [[ $sh_file == 0 ]]; then + chmod u+rwx start.sh + echo 'download start.sh success' + fi + + if [[ $config_file == 0 ]]; then + echo 'download config success' + fi + else + echo 'no exists wget, make sure the system can use the "wget" command' + fi +} + +cloneCode() { + if type git >/dev/null 2>&1; then + git_clone=$(git clone -b master git@github.com:tronprotocol/java-tron.git) + if [[ git_clone == 0 ]]; then + echo 'git clone java-tron success' + fi + else + echo 'no exists git, make sure the system can use the "git" command' + fi +} + +cloneBuild() { + clone=`cloneCode` + if [[ $clone == 0 ]]; then + cd 'java-tron' + echo "build java-tron" + sh gradlew clean build -x test + fi +} + +if [[ $START_OPT == '-download' ]]; then + download + sh start.sh +elif [[ $START_OPT == '-clone' ]]; then + cloneCode +elif [[ $START_OPT == '-cb' ]]; then + cloneBuild +else + download +fi +``` + + diff --git a/quickstart.sh b/quickstart.sh new file mode 100644 index 00000000000..a5bf70879e0 --- /dev/null +++ b/quickstart.sh @@ -0,0 +1,65 @@ +#!/bin/bash +START_OPT=$1 +FULL_NODE_DIR="FullNode" +FULL_NODE_VERSION="GreatVoyage-v4.3.0" + +download() { + if [ ! -d "$FULL_NODE_DIR" ]; then + mkdir $FULL_NODE_DIR + cd $FULL_NODE_DIR + elif [ -d "$FULL_NODE_DIR" ]; then + cd $FULL_NODE_DIR + fi + + if type wget >/dev/null 2>&1; then + config_file=$(wget https://raw.githubusercontent.com/tronprotocol/java-tron/develop/framework/src/main/resources/config.conf) + sh_file=$(wget https://raw.githubusercontent.com/tronprotocol/java-tron/develop/start.sh) + full_node=$(wget https://github.com/tronprotocol/java-tron/releases/download/$FULL_NODE_VERSION/FullNode.jar) + + if [[ $full_node == 0 ]]; then + echo 'download FullNode.jar success' + fi + + if [[ $sh_file == 0 ]]; then + chmod u+rwx start.sh + echo 'download start.sh success' + fi + + if [[ $config_file == 0 ]]; then + echo 'download config success' + fi + else + echo 'no exists wget, make sure the system can use the "wget" command' + fi +} + +cloneCode() { + if type git >/dev/null 2>&1; then + git_clone=$(git clone -b master git@github.com:tronprotocol/java-tron.git) + if [[ git_clone == 0 ]]; then + echo 'git clone java-tron success' + fi + else + echo 'no exists git, make sure the system can use the "git" command' + fi +} + +cloneBuild() { + clone=`cloneCode` + if [[ $clone == 0 ]]; then + cd 'java-tron' + echo "build java-tron" + sh gradlew clean build -x test + fi +} + +if [[ $START_OPT == '-download' ]]; then + download + sh start.sh +elif [[ $START_OPT == '-clone' ]]; then + cloneCode +elif [[ $START_OPT == '-cb' ]]; then + cloneBuild +else + download +fi \ No newline at end of file diff --git a/start.sh b/start.sh index 8c681ab6640..1e30e19b727 100644 --- a/start.sh +++ b/start.sh @@ -75,13 +75,13 @@ checkmemory() { MEM_OPT="$max_matespace_size $max_new_size" elif [[ $total -gt $allow_memory ]] ; then - NEW_RATIO=' -XX:NewSize=6144m -XX:MaxNewSize=6144m ' + new_ratio=' -XX:NewSize=6144m -XX:MaxNewSize=6144m ' MEM_OPT="$max_matespace_size $new_ratio" + else + new_ratio=' -XX:NewRatio=2 ' fi -else - NEW_RATIO=2 - max_matespace_size=$[allow_memory / 16] - MEM_OPT="$max_matespace_size $new_ratio" + else + MEM_OPT=' -XX:NewRatio=2 ' fi } From b7f03c40d4c9275a0794686969ac2a42c8f48048 Mon Sep 17 00:00:00 2001 From: Asuka Date: Tue, 31 Aug 2021 15:14:13 +0800 Subject: [PATCH 184/341] func(rpc,store): remove unused bean or config check --- .../src/main/java/org/tron/core/store/ContractStore.java | 3 --- framework/src/main/java/org/tron/core/Wallet.java | 4 ---- 2 files changed, 7 deletions(-) diff --git a/chainbase/src/main/java/org/tron/core/store/ContractStore.java b/chainbase/src/main/java/org/tron/core/store/ContractStore.java index bdb35ff7aca..169d2b9c67e 100644 --- a/chainbase/src/main/java/org/tron/core/store/ContractStore.java +++ b/chainbase/src/main/java/org/tron/core/store/ContractStore.java @@ -17,9 +17,6 @@ @Component public class ContractStore extends TronStoreWithRevoking { - @Autowired - private AbiStore abiStore; - @Autowired private ContractStore(@Value("contract") String dbName) { super(dbName); diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index 9437580b7d1..12020318593 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -2533,10 +2533,6 @@ public Transaction triggerConstantContract(TriggerSmartContract "No contract or not a smart contract"); } - if (!Args.getInstance().isSupportConstant()) { - throw new ContractValidateException("this node does not support constant"); - } - return callConstantContract(trxCap, builder, retBuilder); } From c338e53ff3f4eeba936920cf9d52e45c7022f8a2 Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Tue, 31 Aug 2021 16:22:41 +0800 Subject: [PATCH 185/341] remove unused method initCacheTxs --- .../main/java/org/tron/core/db/Manager.java | 59 +------------------ 1 file changed, 2 insertions(+), 57 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 1742841a746..78476d59436 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -414,7 +414,8 @@ public void init() { //for test only chainBaseManager.getDynamicPropertiesStore().updateDynamicStoreByConfig(); - // initCacheTxs(); + long headNum = chainBaseManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber(); + logger.info("current headNum is: {}", headNum); revokingStore.enable(); validateSignService = Executors .newFixedThreadPool(Args.getInstance().getValidateSignThreadNum()); @@ -556,62 +557,6 @@ private void initWitness() { }); } - public void initCacheTxs() { - logger.info("begin to init txs cache."); - int dbVersion = Args.getInstance().getStorage().getDbVersion(); - if (dbVersion != 2) { - return; - } - long start = System.currentTimeMillis(); - long headNum = chainBaseManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber(); - logger.info("current headNum is: {}", headNum); - long recentBlockCount = chainBaseManager.getRecentBlockStore().size(); - ListeningExecutorService service = MoreExecutors - .listeningDecorator(Executors.newFixedThreadPool(50)); - List> futures = new ArrayList<>(); - AtomicLong blockCount = new AtomicLong(0); - AtomicLong emptyBlockCount = new AtomicLong(0); - LongStream.rangeClosed(headNum - recentBlockCount + 1, headNum).forEach( - blockNum -> futures.add(service.submit(() -> { - try { - blockCount.incrementAndGet(); - if (chainBaseManager.getBlockByNum(blockNum).getTransactions().isEmpty()) { - emptyBlockCount.incrementAndGet(); - // transactions is null, return - return; - } - chainBaseManager.getBlockByNum(blockNum).getTransactions().stream() - .map(tc -> tc.getTransactionId().getBytes()) - .map(bytes -> Maps.immutableEntry(bytes, Longs.toByteArray(blockNum))) - .forEach(e -> transactionCache - .put(e.getKey(), new BytesCapsule(e.getValue()))); - } catch (ItemNotFoundException e) { - if (!CommonParameter.getInstance().isLiteFullNode) { - logger.warn("block not found. num: {}", blockNum); - } - } catch (BadItemException e) { - throw new IllegalStateException("init txs cache error.", e); - } - }))); - - ListenableFuture future = Futures.allAsList(futures); - try { - future.get(); - service.shutdown(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } catch (ExecutionException e) { - logger.info(e.getMessage()); - } - - logger.info("end to init txs cache. trx ids:{}, block count:{}, empty block count:{}, cost:{}", - transactionCache.size(), - blockCount.get(), - emptyBlockCount.get(), - System.currentTimeMillis() - start - ); - } - public AccountStore getAccountStore() { return chainBaseManager.getAccountStore(); } From ad66fa168f0ebab9e431ec3d761fbee4cc1d8f30 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Tue, 31 Aug 2021 19:29:29 +0800 Subject: [PATCH 186/341] modify sync check logic --- .../main/java/org/tron/common/overlay/server/SyncPool.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/tron/common/overlay/server/SyncPool.java b/framework/src/main/java/org/tron/common/overlay/server/SyncPool.java index 093a8ea5f0e..98d8de07331 100644 --- a/framework/src/main/java/org/tron/common/overlay/server/SyncPool.java +++ b/framework/src/main/java/org/tron/common/overlay/server/SyncPool.java @@ -86,13 +86,14 @@ public void init() { } private void check() { - activePeers.forEach(peer -> { + for (PeerConnection peer : new ArrayList<>(activePeers)) { long now = System.currentTimeMillis(); long disconnectTime = peer.getDisconnectTime(); if (disconnectTime != 0 && now - disconnectTime > disconnectTimeout) { + logger.warn("Notify disconnect peer {}.", peer.getInetAddress()); channelManager.notifyDisconnect(peer); } - }); + } } private void fillUp() { From 537f0359413c89e902874d0a259787a16169c3c6 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Wed, 1 Sep 2021 11:03:04 +0800 Subject: [PATCH 187/341] modify get active peers logic --- .../main/java/org/tron/common/overlay/server/SyncPool.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/tron/common/overlay/server/SyncPool.java b/framework/src/main/java/org/tron/common/overlay/server/SyncPool.java index 98d8de07331..f9d64c76d41 100644 --- a/framework/src/main/java/org/tron/common/overlay/server/SyncPool.java +++ b/framework/src/main/java/org/tron/common/overlay/server/SyncPool.java @@ -139,11 +139,11 @@ synchronized void logActivePeers() { public List getActivePeers() { List peers = Lists.newArrayList(); - activePeers.forEach(peer -> { + for (PeerConnection peer : new ArrayList<>(activePeers)) { if (!peer.isDisconnect()) { peers.add(peer); } - }); + } return peers; } From e6678829d0ea594e9b2da98d3d2cdaa307017eac Mon Sep 17 00:00:00 2001 From: neo hong Date: Wed, 1 Sep 2021 11:13:11 +0800 Subject: [PATCH 188/341] remove setVersion in PublicMethod --- .../stest/tron/wallet/common/client/utils/PublicMethed.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/framework/src/test/java/stest/tron/wallet/common/client/utils/PublicMethed.java b/framework/src/test/java/stest/tron/wallet/common/client/utils/PublicMethed.java index b1a8053f12c..fe7ceda6758 100644 --- a/framework/src/test/java/stest/tron/wallet/common/client/utils/PublicMethed.java +++ b/framework/src/test/java/stest/tron/wallet/common/client/utils/PublicMethed.java @@ -76,7 +76,6 @@ import org.tron.common.utils.Commons; import org.tron.core.Wallet; import org.tron.core.capsule.BlockCapsule.BlockId; -import org.tron.core.vm.config.VMConfig; import org.tron.core.zen.address.DiversifierT; import org.tron.core.zen.address.ExpandedSpendingKey; import org.tron.core.zen.address.FullViewingKey; @@ -2599,9 +2598,6 @@ public static byte[] deployContract(String contractName, String abiString, Strin byteCode = Hex.decode(code); } builder.setBytecode(ByteString.copyFrom(byteCode)); - if (VMConfig.allowTvmCompatibleEvm()) { - builder.setVersion(1); - } Builder contractBuilder = CreateSmartContract.newBuilder(); contractBuilder.setOwnerAddress(ByteString.copyFrom(owner)); From ccf8ca9d5627fa0544f8fd4f391c2c0a22223235 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Wed, 1 Sep 2021 12:18:26 +0800 Subject: [PATCH 189/341] modify disconnect timeout --- .../src/main/java/org/tron/common/overlay/server/SyncPool.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/common/overlay/server/SyncPool.java b/framework/src/main/java/org/tron/common/overlay/server/SyncPool.java index f9d64c76d41..808481a1983 100644 --- a/framework/src/main/java/org/tron/common/overlay/server/SyncPool.java +++ b/framework/src/main/java/org/tron/common/overlay/server/SyncPool.java @@ -59,7 +59,7 @@ public class SyncPool { private PeerClient peerClient; - private int disconnectTimeout = 10_000; + private int disconnectTimeout = 60_000; public void init() { From c7f60fc7c9b04229fe2f3c05ca7d6b5edb78074e Mon Sep 17 00:00:00 2001 From: Asuka Date: Wed, 1 Sep 2021 14:16:09 +0800 Subject: [PATCH 190/341] func(rpc): invoke deploy contract if contract address is empty through TriggerConstantContract --- .../src/main/java/org/tron/core/Wallet.java | 44 +++++++++++-------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index 12020318593..f6311585ff3 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -2516,29 +2516,36 @@ public Transaction triggerContract(TriggerSmartContract } } - public Transaction triggerConstantContract(TriggerSmartContract - triggerSmartContract, - TransactionCapsule trxCap, Builder builder, - Return.Builder retBuilder) + public Transaction triggerConstantContract(TriggerSmartContract triggerSmartContract, + TransactionCapsule trxCap, Builder builder, Return.Builder retBuilder) throws ContractValidateException, ContractExeException, HeaderNotFound, VMIllegalException { - ContractStore contractStore = chainBaseManager.getContractStore(); - byte[] contractAddress = triggerSmartContract.getContractAddress() - .toByteArray(); - byte[] isContractExist = contractStore - .findContractByHash(contractAddress); - - if (ArrayUtils.isEmpty(isContractExist)) { - throw new ContractValidateException( - "No contract or not a smart contract"); + if (triggerSmartContract.getContractAddress().isEmpty()) { // deploy contract + CreateSmartContract.Builder deployBuilder = CreateSmartContract.newBuilder(); + deployBuilder.setOwnerAddress(triggerSmartContract.getOwnerAddress()); + deployBuilder.setNewContract(SmartContract.newBuilder() + .setOriginAddress(triggerSmartContract.getOwnerAddress()) + .setBytecode(triggerSmartContract.getData()) + .setCallValue(triggerSmartContract.getCallValue()) + .setConsumeUserResourcePercent(100) + .setOriginEnergyLimit(1) + .build() + ); + deployBuilder.setCallTokenValue(triggerSmartContract.getCallTokenValue()); + deployBuilder.setTokenId(triggerSmartContract.getTokenId()); + trxCap = createTransactionCapsule(deployBuilder.build(), ContractType.CreateSmartContract); + } else { // call contract + ContractStore contractStore = chainBaseManager.getContractStore(); + byte[] contractAddress = triggerSmartContract.getContractAddress().toByteArray(); + if (contractStore.get(contractAddress) == null) { + throw new ContractValidateException("Smart contract is not exist."); + } } - return callConstantContract(trxCap, builder, retBuilder); } - public Transaction callConstantContract(TransactionCapsule trxCap, Builder - builder, - Return.Builder retBuilder) + public Transaction callConstantContract(TransactionCapsule trxCap, + Builder builder, Return.Builder retBuilder) throws ContractValidateException, ContractExeException, HeaderNotFound, VMIllegalException { if (!Args.getInstance().isSupportConstant()) { @@ -2555,8 +2562,7 @@ public Transaction callConstantContract(TransactionCapsule trxCap, Builder } TransactionContext context = new TransactionContext(new BlockCapsule(headBlock), trxCap, - StoreFactory.getInstance(), true, - false); + StoreFactory.getInstance(), true, false); VMActuator vmActuator = new VMActuator(true); vmActuator.validate(context); From f903cf22178c0035cad0e6875b7526ba163c6121 Mon Sep 17 00:00:00 2001 From: Asuka Date: Wed, 1 Sep 2021 14:17:44 +0800 Subject: [PATCH 191/341] func(tvm): move setting constant result after consuming energy for saving code --- .../org/tron/core/actuator/VMActuator.java | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/actuator/VMActuator.java b/actuator/src/main/java/org/tron/core/actuator/VMActuator.java index e0861d3b77a..1d9b6797cd1 100644 --- a/actuator/src/main/java/org/tron/core/actuator/VMActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/VMActuator.java @@ -177,15 +177,6 @@ public void execute(Object object) throws ContractExeException { vm.play(program); result = program.getResult(); - if (isConstantCall) { - if (result.getException() != null) { - result.setRuntimeError(result.getException().getMessage()); - result.rejectInternalTransactions(); - } - context.setProgramResult(result); - return; - } - if (TrxType.TRX_CONTRACT_CREATION_TYPE == trxType && !result.isRevert()) { byte[] code = program.getResult().getHReturn(); if (code.length != 0 && vmConfig.allowTvmLondon() && code[0] == (byte) 0xEF) { @@ -210,6 +201,15 @@ public void execute(Object object) throws ContractExeException { } } + if (isConstantCall) { + if (result.getException() != null) { + result.setRuntimeError(result.getException().getMessage()); + result.rejectInternalTransactions(); + } + context.setProgramResult(result); + return; + } + if (result.getException() != null || result.isRevert()) { result.getDeleteAccounts().clear(); result.getLogInfoList().clear(); @@ -364,6 +364,9 @@ private void create() } else { energyLimit = getAccountEnergyLimitWithFloatRatio(creator, feeLimit, callValue); } + if (isConstantCall) { + energyLimit = CommonParameter.getInstance().maxEnergyLimitForConstant; + } checkTokenValueAndId(tokenValue, tokenId); From 89cd21f6de7c99d547b0a7a80694b0bc4b48c387 Mon Sep 17 00:00:00 2001 From: neo hong Date: Wed, 1 Sep 2021 14:41:03 +0800 Subject: [PATCH 192/341] add test --- .../runtime/vm/AllowTvmCompatibleEvmTest.java | 276 ++++++++++++++++++ .../common/runtime/vm/AllowTvmLondonTest.java | 110 +++++++ 2 files changed, 386 insertions(+) create mode 100644 framework/src/test/java/org/tron/common/runtime/vm/AllowTvmCompatibleEvmTest.java create mode 100644 framework/src/test/java/org/tron/common/runtime/vm/AllowTvmLondonTest.java diff --git a/framework/src/test/java/org/tron/common/runtime/vm/AllowTvmCompatibleEvmTest.java b/framework/src/test/java/org/tron/common/runtime/vm/AllowTvmCompatibleEvmTest.java new file mode 100644 index 00000000000..249df82f34b --- /dev/null +++ b/framework/src/test/java/org/tron/common/runtime/vm/AllowTvmCompatibleEvmTest.java @@ -0,0 +1,276 @@ +package org.tron.common.runtime.vm; + +import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.encoders.Hex; +import org.junit.Test; +import org.testng.Assert; +import org.tron.common.runtime.TVMTestResult; +import org.tron.common.runtime.TvmTestUtils; +import org.tron.common.utils.WalletUtil; +import org.tron.core.exception.ContractExeException; +import org.tron.core.exception.ContractValidateException; +import org.tron.core.exception.ReceiptCheckErrException; +import org.tron.core.exception.VMIllegalException; +import org.tron.core.vm.config.ConfigLoader; +import org.tron.core.vm.config.VMConfig; +import org.tron.protos.Protocol; +import stest.tron.wallet.common.client.utils.AbiUtil; + +import java.util.Collections; + +import static org.tron.common.utils.ByteUtil.*; + +@Slf4j +public class AllowTvmCompatibleEvmTest extends VMTestBase { + /*contract c { + function getRipemd160() public view returns(bytes32 output) { + string memory input = "11"; + assembly { + if iszero(staticcall(not(0), 0x20003, add(input, 0x20), 0x2, output, 0x20)) { + revert(0, 0) + } + output := mload(add(output,0x0c)) + } + + } + }*/ + + @Test + public void testEthRipemd160() throws ContractExeException, ReceiptCheckErrException, + VMIllegalException, ContractValidateException { + ConfigLoader.disable = true; + VMConfig.initAllowTvmTransferTrc10(1); + VMConfig.initAllowTvmConstantinople(1); + VMConfig.initAllowTvmSolidity059(1); + VMConfig.initAllowTvmIstanbul(1); + VMConfig.initAllowTvmLondon(1); + VMConfig.initAllowTvmCompatibleEvm(1); + manager.getDynamicPropertiesStore().saveChangeDelegation(1); + + String contractName = "testEthRipemd160"; + byte[] address = Hex.decode(OWNER_ADDRESS); + String abi = "[{\"inputs\":[],\"name\":\"getRipemd160\"," + + "\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"output\",\"type\":\"bytes32\"}]," + + "\"stateMutability\":\"view\",\"type\":\"function\"}]"; + String factoryCode = "608060405234801561001057600080fd5b5060bc" + + "8061001f6000396000f3fe6080604052348015600f57600080fd5b506" + + "004361060285760003560e01c8063c99ea27e14602d575b600080fd5b" + + "60336045565b60405190815260200160405180910390f35b600080604" + + "05180604001604052806002815260200161313160f01b815250905060" + + "208260026020840162020003600019fa607e57600080fd5b50600c015" + + "19056fea2646970667358221220d2f0f2cba312fd79e42db9191048a6" + + "1e0eea399c580d9f2b3c13dd154afebfe164736f6c63430008070033"; + long value = 0; + long feeLimit = 100000000; + long consumeUserResourcePercent = 0; + + // deploy contract + Protocol.Transaction trx = TvmTestUtils.generateDeploySmartContractAndGetTransaction( + contractName, address, abi, factoryCode, value, feeLimit, consumeUserResourcePercent, + null); + byte[] factoryAddress = WalletUtil.generateContractAddress(trx); + runtime = TvmTestUtils.processTransactionAndReturnRuntime(trx, rootDeposit, null); + Assert.assertNull(runtime.getRuntimeError()); + + // Trigger contract method: getRipemd160() + String methodByAddr = "getRipemd160()"; + String hexInput = + AbiUtil.parseMethod(methodByAddr, Collections.singletonList("")); + + TVMTestResult result = TvmTestUtils + .triggerContractAndReturnTvmTestResult(Hex.decode(OWNER_ADDRESS), + factoryAddress, Hex.decode(hexInput), 0, feeLimit, manager, null); + byte[] returnValue = result.getRuntime().getResult().getHReturn(); + Assert.assertNull(result.getRuntime().getRuntimeError()); + Assert.assertEquals(returnValue, + hexToBytes("a76d892cc3522eab763529dfc84b12c080ee1" + + "fe8000000000000000000000000")); + } + + /*contract c { + function F(uint32 rounds, bytes32[2] memory h, bytes32[4] memory m, bytes8[2] memory t, bool f) public view returns (bytes32[2] memory) { + bytes32[2] memory output; + + bytes memory args = abi.encodePacked(rounds, h[0], h[1], m[0], m[1], m[2], m[3], t[0], t[1], f); + + assembly { + if iszero(staticcall(not(0), 0x20009, add(args, 32), 0xd5, output, 0x40)) { + revert(0, 0) + } + } + + return output; + } + + function callF() public view returns (bytes32[2] memory) { + uint32 rounds = 12; + + bytes32[2] memory h; + h[0] = hex"48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5"; + h[1] = hex"d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b"; + + bytes32[4] memory m; + m[0] = hex"6162630000000000000000000000000000000000000000000000000000000000"; + m[1] = hex"0000000000000000000000000000000000000000000000000000000000000000"; + m[2] = hex"0000000000000000000000000000000000000000000000000000000000000000"; + m[3] = hex"0000000000000000000000000000000000000000000000000000000000000000"; + + bytes8[2] memory t; + t[0] = hex"03000000"; + t[1] = hex"00000000"; + + bool f = true; + + // Expected output: + // ba80a53f981c4d0d6a2797b69f12f6e94c212f14685ac4b74b12bb6fdbffa2d1 + // 7d87c5392aab792dc252d5de4533cc9518d38aa8dbf1925ab92386edd4009923 + return F(rounds, h, m, t, f); + } + }*/ + + @Test + public void testBlake2f() throws ContractExeException, ReceiptCheckErrException, + VMIllegalException, ContractValidateException { + ConfigLoader.disable = true; + VMConfig.initAllowTvmTransferTrc10(1); + VMConfig.initAllowTvmConstantinople(1); + VMConfig.initAllowTvmSolidity059(1); + VMConfig.initAllowTvmIstanbul(1); + VMConfig.initAllowTvmLondon(1); + VMConfig.initAllowTvmCompatibleEvm(1); + manager.getDynamicPropertiesStore().saveChangeDelegation(1); + + String contractName = "testBlake2f"; + byte[] address = Hex.decode(OWNER_ADDRESS); + String abi = "[{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"rounds\"," + + "\"type\":\"uint32\"},{\"internalType\":\"bytes32[2]\",\"name\":\"h\"," + + "\"type\":\"bytes32[2]\"},{\"internalType\":\"bytes32[4]\",\"name\":\"m\"," + + "\"type\":\"bytes32[4]\"},{\"internalType\":\"bytes8[2]\",\"name\":\"t\"," + + "\"type\":\"bytes8[2]\"},{\"internalType\":\"bool\",\"name\":\"f\",\"type\":\"bool\"}]," + + "\"name\":\"F\",\"outputs\":[{\"internalType\":\"bytes32[2]\",\"name\":\"\"," + + "\"type\":\"bytes32[2]\"}],\"stateMutability\":\"view\",\"type\":\"function\"}," + + "{\"inputs\":[],\"name\":\"callF\",\"outputs\":[{\"internalType\":\"bytes32[2]\"," + + "\"name\":\"\",\"type\":\"bytes32[2]\"}],\"stateMutability\":\"view\"," + + "\"type\":\"function\"}]"; + String factoryCode = "608060405234801561001057600080fd5b506104b28061" + + "00206000396000f3fe608060405234801561001057600080fd5b50600436106" + + "100365760003560e01c806372de3cbd1461003b578063fc75ac471461006457" + + "5b600080fd5b61004e61004936600461035a565b61006c565b60405161005b9" + + "190610414565b60405180910390f35b61004e610165565b610074610215565b" + + "61007c610215565b60008787826020020151886001602002015188600060200" + + "2015189600160200201518a600260200201518b600360200201518b60006020" + + "0201518c6001602090810291909101516040516001600160e01b031960e09b9" + + "09b1b9a909a16918a0191909152602489019790975260448801959095526064" + + "870193909352608486019190915260a485015260c48401526001600160c01b0" + + "31990811660e48401521660ec82015284151560f81b60f482015260f5016040" + + "51602081830303815290604052905060408260d56020840162020009600019f" + + "a61015a57600080fd5b509695505050505050565b61016d610215565b600c61" + + "0177610215565b7f48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3" + + "cf1361d5f3af54fa581527fd182e6ad7f520e511f6c3e2b8c68059b6bbd41fb" + + "abd9831f79217e1319cde05b60208201526101c8610233565b6261626360e81" + + "b81526000602082018190526040820181905260608201526101ee610215565b" + + "600360f81b815260006020820152600161020b858585858561006c565b95505" + + "05050505090565b604051806040016040528060029060208202803683375091" + + "92915050565b604051806080016040528060049060208202803683375091929" + + "15050565b600082601f83011261026257600080fd5b60405160808101818110" + + "67ffffffffffffffff8211171561029357634e487b7160e01b6000526041600" + + "45260246000fd5b6040528083608081018610156102a857600080fd5b60005b" + + "60048110156102ca5781358352602092830192909101906001016102ab565b5" + + "09195945050505050565b600082601f8301126102e657600080fd5b6102ee61" + + "0445565b80838560408601111561030057600080fd5b6000805b60028110156" + + "103395782356001600160c01b031981168114610324578283fd5b8552602094" + + "8501949290920191600101610304565b50919695505050505050565b8035801" + + "515811461035557600080fd5b919050565b6000806000806000610140868803" + + "121561037357600080fd5b853563ffffffff8116811461038757600080fd5b9" + + "4506020603f8701881361039a57600080fd5b6103a2610445565b8082890160" + + "608a018b8111156103b757600080fd5b60005b60028110156103d7578235855" + + "293850193918501916001016103ba565b508298506103e58c82610251565b97" + + "5050505050506103f98760e088016102d5565b9150610408610120870161034" + + "5565b90509295509295909350565b60408101818360005b600281101561043c" + + "57815183526020928301929091019060010161041d565b50505092915050565" + + "b6040805190810167ffffffffffffffff8111828210171561047657634e487b" + + "7160e01b600052604160045260246000fd5b6040529056fea26469706673582" + + "21220a4795cc7f3618b8a552add0f65ee25825ffc8b8077ec1f838fe8dbae5c" + + "3f412364736f6c63430008070033"; + long value = 0; + long feeLimit = 100000000; + long consumeUserResourcePercent = 0; + + // deploy contract + Protocol.Transaction trx = TvmTestUtils.generateDeploySmartContractAndGetTransaction( + contractName, address, abi, factoryCode, value, feeLimit, consumeUserResourcePercent, + null); + byte[] factoryAddress = WalletUtil.generateContractAddress(trx); + runtime = TvmTestUtils.processTransactionAndReturnRuntime(trx, rootDeposit, null); + Assert.assertNull(runtime.getRuntimeError()); + + // Trigger contract method: callF() + String methodByAddr = "callF()"; + String hexInput = + AbiUtil.parseMethod(methodByAddr, Collections.singletonList("")); + + TVMTestResult result = TvmTestUtils + .triggerContractAndReturnTvmTestResult(Hex.decode(OWNER_ADDRESS), + factoryAddress, Hex.decode(hexInput), 0, feeLimit, manager, null); + byte[] returnValue = result.getRuntime().getResult().getHReturn(); + Assert.assertNull(result.getRuntime().getRuntimeError()); + Assert.assertEquals(returnValue, + hexToBytes("ba80a53f981c4d0d6a2797b69f12f6e94c212f14685ac4b74b12bb6fdbffa2d17d87" + + "c5392aab792dc252d5de4533cc9518d38aa8dbf1925ab92386edd4009923")); + } + + /*contract c { + function getprice() public view returns(uint) { + return tx.gasprice; + } + }*/ + + @Test + public void testGasPrice() throws ContractExeException, ReceiptCheckErrException, + VMIllegalException, ContractValidateException { + ConfigLoader.disable = true; + VMConfig.initAllowTvmTransferTrc10(1); + VMConfig.initAllowTvmConstantinople(1); + VMConfig.initAllowTvmSolidity059(1); + VMConfig.initAllowTvmIstanbul(1); + VMConfig.initAllowTvmLondon(1); + VMConfig.initAllowTvmCompatibleEvm(1); + manager.getDynamicPropertiesStore().saveChangeDelegation(1); + + String contractName = "testGasPrice"; + byte[] address = Hex.decode(OWNER_ADDRESS); + String abi = "[{\"inputs\":[],\"name\":\"getprice\"," + + "\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]," + + "\"stateMutability\":\"view\",\"type\":\"function\"}]"; + String factoryCode = "6080604052348015600f57600080fd5b50607680601d" + + "6000396000f3fe6080604052348015600f57600080fd5b506004361060285" + + "760003560e01c80630fcb598414602d575b600080fd5b3a60405190815260" + + "200160405180910390f3fea2646970667358221220ee994af43fb1d2a4594" + + "ae1355099296fc098d01a7dbe9056530031db6fb9b9c464736f6c63430008070033"; + long value = 0; + long feeLimit = 100000000; + long consumeUserResourcePercent = 0; + + // deploy contract + Protocol.Transaction trx = TvmTestUtils.generateDeploySmartContractAndGetTransaction( + contractName, address, abi, factoryCode, value, feeLimit, consumeUserResourcePercent, + null); + byte[] factoryAddress = WalletUtil.generateContractAddress(trx); + runtime = TvmTestUtils.processTransactionAndReturnRuntime(trx, rootDeposit, null); + Assert.assertNull(runtime.getRuntimeError()); + + // Trigger contract method: getprice() + String methodByAddr = "getprice()"; + String hexInput = + AbiUtil.parseMethod(methodByAddr, Collections.singletonList("")); + + TVMTestResult result = TvmTestUtils + .triggerContractAndReturnTvmTestResult(Hex.decode(OWNER_ADDRESS), + factoryAddress, Hex.decode(hexInput), 0, feeLimit, manager, null); + byte[] returnValue = result.getRuntime().getResult().getHReturn(); + Assert.assertNull(result.getRuntime().getRuntimeError()); + Assert.assertEquals(returnValue, + longTo32Bytes(manager.getDynamicPropertiesStore().getEnergyFee())); + } + +} diff --git a/framework/src/test/java/org/tron/common/runtime/vm/AllowTvmLondonTest.java b/framework/src/test/java/org/tron/common/runtime/vm/AllowTvmLondonTest.java new file mode 100644 index 00000000000..0a4780a6372 --- /dev/null +++ b/framework/src/test/java/org/tron/common/runtime/vm/AllowTvmLondonTest.java @@ -0,0 +1,110 @@ +package org.tron.common.runtime.vm; + +import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.encoders.Hex; +import org.junit.Test; +import org.testng.Assert; +import org.tron.common.runtime.TVMTestResult; +import org.tron.common.runtime.TvmTestUtils; +import org.tron.common.utils.WalletUtil; +import org.tron.core.exception.ContractExeException; +import org.tron.core.exception.ContractValidateException; +import org.tron.core.exception.ReceiptCheckErrException; +import org.tron.core.exception.VMIllegalException; +import org.tron.core.vm.config.ConfigLoader; +import org.tron.core.vm.config.VMConfig; +import org.tron.protos.Protocol; +import stest.tron.wallet.common.client.utils.AbiUtil; + +import java.util.Collections; + +import static org.tron.common.utils.ByteUtil.longTo32Bytes; + +@Slf4j +public class AllowTvmLondonTest extends VMTestBase { + + /*contract c { + + function getbasefee() public returns(uint) { + return block.basefee; + } + + }*/ + + @Test + public void testBaseFee() throws ContractExeException, ReceiptCheckErrException, + VMIllegalException, ContractValidateException { + ConfigLoader.disable = true; + VMConfig.initAllowTvmTransferTrc10(1); + VMConfig.initAllowTvmConstantinople(1); + VMConfig.initAllowTvmSolidity059(1); + VMConfig.initAllowTvmIstanbul(1); + VMConfig.initAllowTvmLondon(1); + manager.getDynamicPropertiesStore().saveChangeDelegation(1); + + String contractName = "testBaseFee"; + byte[] address = Hex.decode(OWNER_ADDRESS); + String abi = "[{\"inputs\":[],\"name\":\"getbasefee\"," + + "\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]," + + "\"stateMutability\":\"view\",\"type\":\"function\"}]"; + String factoryCode = "6080604052348015600f57600080fd5b50607680" + + "601d6000396000f3fe6080604052348015600f57600080fd5b5060043" + + "61060285760003560e01c80632266bff614602d575b600080fd5b4860" + + "405190815260200160405180910390f3fea2646970667358221220091" + + "a527d7e484183e543b1ba4520176c089c72f6f3451d8419a19b363314" + + "674a64736f6c63430008070033"; + long value = 0; + long feeLimit = 100000000; + long consumeUserResourcePercent = 0; + + // deploy contract + Protocol.Transaction trx = TvmTestUtils.generateDeploySmartContractAndGetTransaction( + contractName, address, abi, factoryCode, value, feeLimit, consumeUserResourcePercent, + null); + byte[] factoryAddress = WalletUtil.generateContractAddress(trx); + runtime = TvmTestUtils.processTransactionAndReturnRuntime(trx, rootDeposit, null); + Assert.assertNull(runtime.getRuntimeError()); + + // Trigger contract method: getbasefee() + String methodByAddr = "getbasefee()"; + String hexInput = + AbiUtil.parseMethod(methodByAddr, Collections.singletonList("")); + + TVMTestResult result = TvmTestUtils + .triggerContractAndReturnTvmTestResult(Hex.decode(OWNER_ADDRESS), + factoryAddress, Hex.decode(hexInput), 0, feeLimit, manager, null); + byte[] returnValue = result.getRuntime().getResult().getHReturn(); + Assert.assertNull(result.getRuntime().getRuntimeError()); + Assert.assertEquals(returnValue, + longTo32Bytes(manager.getDynamicPropertiesStore().getEnergyFee())); + } + + @Test + public void testStartWithEF() throws ContractExeException, ReceiptCheckErrException, + VMIllegalException, ContractValidateException { + ConfigLoader.disable = true; + VMConfig.initAllowTvmTransferTrc10(1); + VMConfig.initAllowTvmConstantinople(1); + VMConfig.initAllowTvmSolidity059(1); + VMConfig.initAllowTvmIstanbul(1); + VMConfig.initAllowTvmLondon(1); + manager.getDynamicPropertiesStore().saveChangeDelegation(1); + + String contractName = "testStartWithEF"; + byte[] address = Hex.decode(OWNER_ADDRESS); + String abi = "[{\"inputs\":[],\"name\":\"getbasefee\"," + + "\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]," + + "\"stateMutability\":\"view\",\"type\":\"function\"}]"; + String factoryCode = "60ef60005360016000f3"; + long value = 0; + long feeLimit = 100000000; + long consumeUserResourcePercent = 0; + + // deploy contract + Protocol.Transaction trx = TvmTestUtils.generateDeploySmartContractAndGetTransaction( + contractName, address, abi, factoryCode, value, feeLimit, consumeUserResourcePercent, + null); + runtime = TvmTestUtils.processTransactionAndReturnRuntime(trx, rootDeposit, null); + Assert.assertNotNull(runtime.getRuntimeError()); + } +} From dc86be3371f4d6558a2828bc598e00220fbe4f9d Mon Sep 17 00:00:00 2001 From: daxinzang1 <280474930@qq.com> Date: Wed, 1 Sep 2021 16:22:54 +0800 Subject: [PATCH 193/341] Add rpc test case --- .../common/client/utils/HttpMethed.java | 3 + .../common/client/utils/JsonRpcBase.java | 341 ++++++++++++++++++ .../jsonrpc/BuildTransaction001.java | 95 +++++ .../jsonrpc/EthSmartContract001.java | 80 ++++ .../dailybuild/jsonrpc/GetBlock001.java | 38 ++ framework/src/test/resources/testng.conf | 7 + 6 files changed, 564 insertions(+) create mode 100644 framework/src/test/java/stest/tron/wallet/common/client/utils/JsonRpcBase.java create mode 100644 framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/BuildTransaction001.java create mode 100644 framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/EthSmartContract001.java create mode 100644 framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/GetBlock001.java diff --git a/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java b/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java index 47e541ec572..5cf1167d4b1 100644 --- a/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java +++ b/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java @@ -2021,6 +2021,9 @@ public static Long getBalance(String httpNode, byte[] queryAddress) { responseContent = HttpMethed.parseResponseContent(response); //HttpMethed.printJsonContent(responseContent); //httppost.releaseConnection(); + if (!responseContent.containsKey("balance")) { + return 0L; + } return Long.parseLong(responseContent.get("balance").toString()); } diff --git a/framework/src/test/java/stest/tron/wallet/common/client/utils/JsonRpcBase.java b/framework/src/test/java/stest/tron/wallet/common/client/utils/JsonRpcBase.java new file mode 100644 index 00000000000..fffb6350a78 --- /dev/null +++ b/framework/src/test/java/stest/tron/wallet/common/client/utils/JsonRpcBase.java @@ -0,0 +1,341 @@ +package stest.tron.wallet.common.client.utils; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.protobuf.ByteString; +import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; +import io.grpc.Status; +import io.netty.util.internal.StringUtil; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import java.util.Random; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.bouncycastle.util.encoders.Hex; +import org.testng.Assert; +import org.testng.annotations.BeforeSuite; +import org.tron.api.GrpcAPI; +import org.tron.api.GrpcAPI.BytesMessage; +import org.tron.api.GrpcAPI.EmptyMessage; +import org.tron.api.GrpcAPI.Note; +import org.tron.api.GrpcAPI.ShieldedTRC20Parameters; +import org.tron.api.GrpcAPI.TransactionExtention; +import org.tron.api.WalletGrpc; +import org.tron.api.WalletSolidityGrpc; +import org.tron.common.utils.ByteArray; +import org.tron.common.utils.ByteUtil; +import org.tron.common.utils.Commons; +import org.tron.core.Wallet; +import org.tron.core.exception.ZksnarkException; +import org.tron.core.services.http.Util; +import org.tron.core.zen.address.DiversifierT; +import org.tron.protos.Protocol.TransactionInfo; +import org.tron.protos.contract.ShieldContract; +import stest.tron.wallet.common.client.Configuration; +import stest.tron.wallet.common.client.Parameter.CommonConstant; + +@Slf4j +public class JsonRpcBase { + + public final String foundationAccountKey = Configuration.getByPath("testng.conf") + .getString("foundationAccount.key1"); + public final byte[] foundationAccountAddress = PublicMethed.getFinalAddress(foundationAccountKey); + + public static final String jsonRpcOwnerKey = Configuration.getByPath("testng.conf") + .getString("defaultParameter.jsonRpcOnwerKey"); + public static final byte[] jsonRpcOwnerAddress = PublicMethed + .getFinalAddress(jsonRpcOwnerKey); + public static final String jsonRpcOwnerAddressString = PublicMethed + .getAddressString(jsonRpcOwnerKey); + + + public static String jsonRpcNode = Configuration.getByPath("testng.conf") + .getStringList("jsonRpcNode.ip.list").get(0); + public static String httpFullNode = Configuration.getByPath("testng.conf") + .getStringList("httpnode.ip.list").get(0); + + public ManagedChannel channelFull = null; + public WalletGrpc.WalletBlockingStub blockingStubFull = null; + public ManagedChannel channelSolidity = null; + public ManagedChannel channelPbft = null; + + public WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubSolidity = null; + public WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubPbft = null; + private String fullnode = Configuration.getByPath("testng.conf") + .getStringList("fullnode.ip.list").get(0); + + public static long maxFeeLimit = Configuration.getByPath("testng.conf") + .getLong("defaultParameter.maxFeeLimit"); + public static String trc20AddressByteString; + public static String trc20AddressHex; + public static String contractAddressFrom58; + public static String contractAddressFromHex; + public static ByteString shieldAddressByteString; + public static byte[] shieldAddressByte; + public static String shieldAddress; + public static String deployTrc20Txid; + public static String deployShieldTxid; + public static String mint = "mint(uint256,bytes32[9],bytes32[2],bytes32[21])"; + public static String transfer = + "transfer(bytes32[10][],bytes32[2][],bytes32[9][],bytes32[2],bytes32[21][])"; + public static String burn = "burn(bytes32[10],bytes32[2],uint256,bytes32[2],address," + + "bytes32[3],bytes32[9][],bytes32[21][])"; + public Wallet wallet = new Wallet(); + static HttpResponse response; + static HttpPost httppost; + static JSONObject responseContent; + public static Integer scalingFactorLogarithm = 0; + public static Long totalSupply = 1000000000000L; + public static String name = "jsonrpc-test"; + public static String jsonRpcAssetId; + public static Integer blockNum; + public static String blockNumHex; + public static String blockId; + public static String txid; + + + /** + * constructor. + */ + @BeforeSuite(enabled = true, description = "Deploy json rpc test case resource") + public void deployJsonRpcUseResource() throws Exception { + Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); + channelFull = ManagedChannelBuilder.forTarget(fullnode) + .usePlaintext(true) + .build(); + blockingStubFull = WalletGrpc.newBlockingStub(channelFull); + + if (PublicMethed.queryAccount(jsonRpcOwnerAddress, blockingStubFull).getAssetV2Count() == 0L) { + Assert.assertTrue(PublicMethed.sendcoin(jsonRpcOwnerAddress, 2048000000L, + foundationAccountAddress, foundationAccountKey, blockingStubFull)); + PublicMethed.waitProduceNextBlock(blockingStubFull); + + + + //Create a new Asset Issue + Assert.assertTrue(PublicMethed.createAssetIssue(jsonRpcOwnerAddress, + name, totalSupply, 1, 1, System.currentTimeMillis() + 5000, + System.currentTimeMillis() + 1000000000, 1, + "description", "urlurlurl", + 2000L, 2000L, 1L, 1L, + jsonRpcOwnerKey, blockingStubFull)); + + + PublicMethed.waitProduceNextBlock(blockingStubFull); + } + + + response = HttpMethed.getAccount(httpFullNode, jsonRpcOwnerAddress); + responseContent = HttpMethed.parseResponseContent(response); + jsonRpcAssetId = responseContent.getString("asset_issued_ID"); + + + + deployContract(); + triggerContract(); + deployTrc20Contract(); + + + + + + } + + /** + * constructor. + */ + public void deployContract() throws Exception { + final Long beforeTokenBalance = PublicMethed.getAssetBalanceByAssetId(ByteString + .copyFromUtf8(jsonRpcAssetId), jsonRpcOwnerKey, blockingStubFull); + + JsonObject param = new JsonObject(); + param.addProperty("from", ByteArray.toHexString(jsonRpcOwnerAddress)); + param.addProperty("name", "transferTokenContract"); + param.addProperty("gas", "0x245498"); + String code = Configuration.getByPath("testng.conf") + .getString("code.code_ContractTrcToken001_transferTokenContract"); + String abi = Configuration.getByPath("testng.conf") + .getString("abi.abi_ContractTrcToken001_transferTokenContract"); + param.addProperty("abi", abi); + param.addProperty("data", code); + param.addProperty("consumeUserResourcePercent", 100); + param.addProperty("originEnergyLimit", 11111111111111L); + param.addProperty("value", "0x1f4"); + param.addProperty("tokenId", Long.valueOf(jsonRpcAssetId)); + param.addProperty("tokenValue", 1); + JsonArray params = new JsonArray(); + params.add(param); + JsonObject requestBody = getJsonRpcBody("buildTransaction",params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String transactionString = responseContent.getJSONObject("result").getString("transaction"); + String transactionSignString = HttpMethed.gettransactionsign(httpFullNode, + transactionString, jsonRpcOwnerKey); + + responseContent = HttpMethed.parseStringContent(transactionString); + final String txid = responseContent.getString("txID"); + + + response = HttpMethed.broadcastTransaction(httpFullNode, transactionSignString); + org.junit.Assert.assertTrue(HttpMethed.verificationResult(response)); + + HttpMethed.waitToProduceOneBlock(httpFullNode); + Long afterTokenBalance = PublicMethed.getAssetBalanceByAssetId(ByteString + .copyFromUtf8(jsonRpcAssetId), jsonRpcOwnerKey, blockingStubFull); + + org.junit.Assert.assertEquals(beforeTokenBalance - afterTokenBalance,1L); + + logger.info(txid); + response = HttpMethed.getTransactionById(httpFullNode, txid); + responseContent = HttpMethed.parseResponseContent(response); + HttpMethed.printJsonContent(responseContent); + org.junit.Assert.assertTrue(!responseContent.getString("contract_address").isEmpty()); + contractAddressFrom58 = responseContent.getString("contract_address"); + } + + /** + * constructor. + */ + public void triggerContract() throws Exception { + final Long beforeTokenBalance = PublicMethed.getAssetBalanceByAssetId(ByteString + .copyFromUtf8(jsonRpcAssetId), foundationAccountKey, blockingStubFull); + final Long beforeBalance = HttpMethed.getBalance(httpFullNode, jsonRpcOwnerAddress); + JsonObject param = new JsonObject(); + param.addProperty("from", "0x" + ByteArray + .toHexString(jsonRpcOwnerAddress).substring(2)); + param.addProperty("to", "0x" + contractAddressFrom58); + + + String addressParam = "000000000000000000000000" + ByteArray + .toHexString(foundationAccountAddress).substring(2);//[0,3) + + String tokenIdParam = "00000000000000000000000000000000000000000000000000000000000" + Integer + .toHexString(Integer.valueOf(jsonRpcAssetId)); + + String tokenValueParam = "0000000000000000000000000000000000000000000000000000000000000001"; + String paramString = addressParam + tokenIdParam + tokenValueParam; + + String selector = "TransferTokenTo(address,trcToken,uint256)"; + + + + param.addProperty("data", "0x" + Util.parseMethod(selector, paramString)); + param.addProperty("gas", "0x245498"); + param.addProperty("value", "0x1389"); + param.addProperty("tokenId", Long.valueOf(jsonRpcAssetId)); + param.addProperty("tokenValue", 1); + JsonArray params = new JsonArray(); + params.add(param); + JsonObject requestBody = getJsonRpcBody("buildTransaction",params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String transactionString = responseContent.getJSONObject("result").getString("transaction"); + logger.info("transactionString : " + transactionString); + String transactionSignString = HttpMethed.gettransactionsign(httpFullNode, + transactionString, jsonRpcOwnerKey); + + responseContent = HttpMethed.parseStringContent(transactionString); + txid = responseContent.getString("txID"); + + + response = HttpMethed.broadcastTransaction(httpFullNode, transactionSignString); + org.junit.Assert.assertTrue(HttpMethed.verificationResult(response)); + + HttpMethed.waitToProduceOneBlock(httpFullNode); + Long afterTokenBalance = PublicMethed.getAssetBalanceByAssetId(ByteString + .copyFromUtf8(jsonRpcAssetId), foundationAccountKey, blockingStubFull); + Long afterBalance = HttpMethed.getBalance(httpFullNode, jsonRpcOwnerAddress); + + org.junit.Assert.assertEquals(beforeTokenBalance - afterTokenBalance,-1L); + org.junit.Assert.assertTrue(beforeBalance - afterBalance >= 5000); + + blockNum = (int)(PublicMethed.getTransactionInfoById(txid, blockingStubFull).get() + .getBlockNumber()); + response = HttpMethed.getBlockByNum(httpFullNode, blockNum); + org.junit.Assert.assertEquals(response.getStatusLine().getStatusCode(), 200); + responseContent = HttpMethed.parseResponseContent(response); + HttpMethed.printJsonContent(responseContent); + blockId = responseContent.get("blockID").toString(); + } + + /** + * constructor. + */ + public void deployTrc20Contract() { + String contractName = "shieldTrc20Token"; + + String abi = Configuration.getByPath("testng.conf") + .getString("abi.abi_shieldTrc20Token"); + String code = Configuration.getByPath("testng.conf") + .getString("code.code_shieldTrc20Token"); + String constructorStr = "constructor(uint256,string,string)"; + String data = totalSupply.toString() + "," + "\"TokenTRC20\"" + "," + "\"zen20\""; + logger.info("data:" + data); + deployTrc20Txid = PublicMethed + .deployContractWithConstantParame(contractName, abi, code, constructorStr, data, "", + maxFeeLimit, 0L, 100, null, + jsonRpcOwnerKey, jsonRpcOwnerAddress, blockingStubFull); + + PublicMethed.waitProduceNextBlock(blockingStubFull); + logger.info(deployTrc20Txid); + Optional infoById = PublicMethed + .getTransactionInfoById(deployTrc20Txid, blockingStubFull); + + trc20AddressHex = ByteArray.toHexString(infoById.get().getContractAddress().toByteArray()); + + } + + + + /** + * constructor. + */ + public static HttpResponse getJsonRpc(String jsonRpcNode,JsonObject jsonRpcObject) { + try { + String requestUrl = "http://" + jsonRpcNode + "/jsonrpc"; + response = HttpMethed.createConnect(requestUrl,jsonRpcObject); + } catch (Exception e) { + e.printStackTrace(); + httppost.releaseConnection(); + return null; + } + return response; + } + + /** + * constructor. + */ + public static JsonObject getJsonRpcBody(String method) { + return getJsonRpcBody(method, new JsonArray(), 1); + } + + /** + * constructor. + */ + public static JsonObject getJsonRpcBody(String method, JsonArray params) { + return getJsonRpcBody(method, params, 1); + } + + /** + * constructor. + */ + public static JsonObject getJsonRpcBody(String method, JsonArray params,Integer id) { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("jsonrpc", "2.0"); + jsonObject.addProperty("method", method); + jsonObject.add("params", params); + jsonObject.addProperty("id", id); + + return jsonObject; + } + + + +} diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/BuildTransaction001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/BuildTransaction001.java new file mode 100644 index 00000000000..06d6ebae4e7 --- /dev/null +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/BuildTransaction001.java @@ -0,0 +1,95 @@ +package stest.tron.wallet.dailybuild.jsonrpc; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.protobuf.ByteString; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpResponse; +import org.junit.Assert; +import org.testng.annotations.Test; +import org.tron.common.crypto.ECKey; +import org.tron.common.utils.ByteArray; +import org.tron.common.utils.Utils; +import stest.tron.wallet.common.client.utils.HttpMethed; +import stest.tron.wallet.common.client.utils.JsonRpcBase; +import stest.tron.wallet.common.client.utils.PublicMethed; + + + +@Slf4j + +public class BuildTransaction001 extends JsonRpcBase { + + JSONArray jsonRpcReceives = new JSONArray(); + //String txid; + private JSONObject responseContent; + private HttpResponse response; + String transactionString; + String transactionSignString; + + ECKey ecKey1 = new ECKey(Utils.getRandom()); + byte[] receiverAddress = ecKey1.getAddress(); + final String receiverKey = ByteArray.toHexString(ecKey1.getPrivKeyBytes()); + + + + + + @Test(enabled = true, description = "Json rpc api of buildTransaction for transfer trx") + public void test01JsonRpcApiTestOfBuildTransactionForTransferTrx() throws Exception { + final Long beforeRecevierBalance = HttpMethed.getBalance(httpFullNode, receiverAddress); + + + JsonObject param = new JsonObject(); + param.addProperty("from", ByteArray.toHexString(jsonRpcOwnerAddress)); + param.addProperty("to", ByteArray.toHexString(receiverAddress)); + param.addProperty("value", "0x1"); + JsonArray params = new JsonArray(); + params.add(param); + JsonObject requestBody = getJsonRpcBody("buildTransaction",params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + transactionString = responseContent.getJSONObject("result").getString("transaction"); + transactionSignString = HttpMethed.gettransactionsign(httpFullNode, transactionString, + jsonRpcOwnerKey); + response = HttpMethed.broadcastTransaction(httpFullNode, transactionSignString); + Assert.assertTrue(HttpMethed.verificationResult(response)); + + HttpMethed.waitToProduceOneBlock(httpFullNode); + Long afterRecevierBalance = HttpMethed.getBalance(httpFullNode, receiverAddress); + + Assert.assertEquals(afterRecevierBalance - beforeRecevierBalance,1L); + + } + + @Test(enabled = true, description = "Json rpc api of buildTransaction for transfer trc10") + public void test02JsonRpcApiTestOfBuildTransactionForTransferTrc10() throws Exception { + final Long beforeTokenBalance = PublicMethed.getAssetBalanceByAssetId(ByteString + .copyFromUtf8(jsonRpcAssetId), receiverKey, blockingStubFull); + JsonObject param = new JsonObject(); + param.addProperty("from", ByteArray.toHexString(jsonRpcOwnerAddress)); + param.addProperty("to", ByteArray.toHexString(receiverAddress)); + param.addProperty("tokenId", Long.valueOf(jsonRpcAssetId)); + param.addProperty("tokenValue", 1); + JsonArray params = new JsonArray(); + params.add(param); + JsonObject requestBody = getJsonRpcBody("buildTransaction",params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + transactionString = responseContent.getJSONObject("result").getString("transaction"); + transactionSignString = HttpMethed.gettransactionsign(httpFullNode, transactionString, + jsonRpcOwnerKey); + response = HttpMethed.broadcastTransaction(httpFullNode, transactionSignString); + Assert.assertTrue(HttpMethed.verificationResult(response)); + + HttpMethed.waitToProduceOneBlock(httpFullNode); + Long afterTokenBalance = PublicMethed.getAssetBalanceByAssetId(ByteString + .copyFromUtf8(jsonRpcAssetId), receiverKey, blockingStubFull); + + Assert.assertEquals(afterTokenBalance - beforeTokenBalance,1L); + + } + +} diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/EthSmartContract001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/EthSmartContract001.java new file mode 100644 index 00000000000..aee3436aed9 --- /dev/null +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/EthSmartContract001.java @@ -0,0 +1,80 @@ +package stest.tron.wallet.dailybuild.jsonrpc; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.protobuf.ByteString; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpResponse; +import org.junit.Assert; +import org.testng.annotations.Test; +import org.tron.common.crypto.ECKey; +import org.tron.common.utils.ByteArray; +import org.tron.common.utils.Utils; +import stest.tron.wallet.common.client.utils.HttpMethed; +import stest.tron.wallet.common.client.utils.JsonRpcBase; +import stest.tron.wallet.common.client.utils.PublicMethed; +import stest.tron.wallet.common.client.utils.ZenTrc20Base; + + +@Slf4j + +public class EthSmartContract001 extends JsonRpcBase { + private JSONObject responseContent; + private HttpResponse response; + + @Test(enabled = true, description = "Json rpc api of eth_call") + public void test01JsonRpcApiTestForEthCall() throws Exception { + JsonObject param = new JsonObject(); + param.addProperty("from", ByteArray.toHexString(jsonRpcOwnerAddress)); + param.addProperty("to", trc20AddressHex); + param.addProperty("gas", "0"); + param.addProperty("gasPrice", "0"); + param.addProperty("value", "0"); + param.addProperty("data", "0x06fdde03"); + JsonArray params = new JsonArray(); + params.add(param); + params.add("latest"); + JsonObject requestBody = getJsonRpcBody("eth_call",params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String dataResult = responseContent.getString("result"); + Assert.assertEquals(dataResult,"0x000000000000000000000000000000000000000000000000000" + + "0000000000020000000000000000000000000000000000000000000000000000000000000000a546f6b65" + + "6e545243323000000000000000000000000000000000000000000000"); + } + + + @Test(enabled = true, description = "Json rpc api of eth_estimateGas") + public void test02JsonRpcApiTestForEthEstimateGas() throws Exception { + JsonObject param = new JsonObject(); + param.addProperty("from", ByteArray.toHexString(jsonRpcOwnerAddress)); + param.addProperty("to", trc20AddressHex); + param.addProperty("gas", "0x0"); + param.addProperty("gasPrice", "0x0"); + param.addProperty("value", "0x0"); + param.addProperty("data", "0x1249c58b"); + JsonArray params = new JsonArray(); + params.add(param); + JsonObject requestBody = getJsonRpcBody("eth_estimateGas",params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String dataResult = responseContent.getString("result"); + Assert.assertEquals(dataResult,"0x147"); + } + + + @Test(enabled = true, description = "Json rpc api of eth_getCode") + public void test03JsonRpcApiTestForEthGetCode() throws Exception { + JsonArray params = new JsonArray(); + params.add(trc20AddressHex); + params.add("latest"); + JsonObject requestBody = getJsonRpcBody("eth_getCode",params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String dataResult = responseContent.getString("result"); + Assert.assertTrue(dataResult.length() > 1000L); + } + +} diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/GetBlock001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/GetBlock001.java new file mode 100644 index 00000000000..aedae7d32cc --- /dev/null +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/GetBlock001.java @@ -0,0 +1,38 @@ +package stest.tron.wallet.dailybuild.jsonrpc; + +import com.alibaba.fastjson.JSONObject; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpResponse; +import org.junit.Assert; +import org.testng.annotations.Test; +import org.tron.common.utils.ByteArray; +import stest.tron.wallet.common.client.utils.HttpMethed; +import stest.tron.wallet.common.client.utils.JsonRpcBase; + + +@Slf4j + +public class GetBlock001 extends JsonRpcBase { + private JSONObject responseContent; + private HttpResponse response; + + @Test(enabled = true, description = "Json rpc api of eth_getBlockByHash") + public void test01JsonRpcApiTestForEthGetBlockByHash() throws Exception { + JsonArray params = new JsonArray(); + params.add(blockId); + params.add("true"); + JsonObject requestBody = getJsonRpcBody("eth_getBlockByHash",params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + + Assert.assertEquals(Integer.toHexString(blockNum), responseContent.getJSONObject("result") + .getString("number").substring(2)); + Assert.assertEquals(blockId, responseContent.getJSONObject("result").getString("hash") + .substring(2)); + Assert.assertTrue(responseContent.getJSONObject("result") + .getJSONArray("transactions").size() >= 1); + } + +} diff --git a/framework/src/test/resources/testng.conf b/framework/src/test/resources/testng.conf index addfb1b71d2..d938ca6bbb0 100644 --- a/framework/src/test/resources/testng.conf +++ b/framework/src/test/resources/testng.conf @@ -81,6 +81,13 @@ eventnode = { ] } +jsonRpcNode = { + ip.list = [ + #"101.200.46.37:50545", + "127.0.0.1:50545", + ] +} + foundationAccount = { key1 = FC8BF0238748587B9617EB6D15D47A66C0E07C1A1959033CF249C6532DC29FE6 From a8b3a819d0c4834e9b4ab2a8d8a55c600a3cb576 Mon Sep 17 00:00:00 2001 From: neo hong Date: Wed, 1 Sep 2021 16:36:07 +0800 Subject: [PATCH 194/341] fix checkStyle --- .../runtime/vm/AllowTvmCompatibleEvmTest.java | 14 ++++++++------ .../tron/common/runtime/vm/AllowTvmLondonTest.java | 7 +++---- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/framework/src/test/java/org/tron/common/runtime/vm/AllowTvmCompatibleEvmTest.java b/framework/src/test/java/org/tron/common/runtime/vm/AllowTvmCompatibleEvmTest.java index 249df82f34b..cba9ef7d7a5 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/AllowTvmCompatibleEvmTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/AllowTvmCompatibleEvmTest.java @@ -1,5 +1,9 @@ package org.tron.common.runtime.vm; +import static org.tron.common.utils.ByteUtil.hexToBytes; +import static org.tron.common.utils.ByteUtil.longTo32Bytes; + +import java.util.Collections; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; import org.junit.Test; @@ -16,10 +20,6 @@ import org.tron.protos.Protocol; import stest.tron.wallet.common.client.utils.AbiUtil; -import java.util.Collections; - -import static org.tron.common.utils.ByteUtil.*; - @Slf4j public class AllowTvmCompatibleEvmTest extends VMTestBase { /*contract c { @@ -88,10 +88,12 @@ public void testEthRipemd160() throws ContractExeException, ReceiptCheckErrExcep } /*contract c { - function F(uint32 rounds, bytes32[2] memory h, bytes32[4] memory m, bytes8[2] memory t, bool f) public view returns (bytes32[2] memory) { + function F(uint32 rounds, bytes32[2] memory h, bytes32[4] memory m, + bytes8[2] memory t, bool f) public view returns (bytes32[2] memory) { bytes32[2] memory output; - bytes memory args = abi.encodePacked(rounds, h[0], h[1], m[0], m[1], m[2], m[3], t[0], t[1], f); + bytes memory args = abi.encodePacked( + rounds, h[0], h[1], m[0], m[1], m[2], m[3], t[0], t[1], f); assembly { if iszero(staticcall(not(0), 0x20009, add(args, 32), 0xd5, output, 0x40)) { diff --git a/framework/src/test/java/org/tron/common/runtime/vm/AllowTvmLondonTest.java b/framework/src/test/java/org/tron/common/runtime/vm/AllowTvmLondonTest.java index 0a4780a6372..c6b3ec10a98 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/AllowTvmLondonTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/AllowTvmLondonTest.java @@ -1,5 +1,8 @@ package org.tron.common.runtime.vm; +import static org.tron.common.utils.ByteUtil.longTo32Bytes; + +import java.util.Collections; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; import org.junit.Test; @@ -16,10 +19,6 @@ import org.tron.protos.Protocol; import stest.tron.wallet.common.client.utils.AbiUtil; -import java.util.Collections; - -import static org.tron.common.utils.ByteUtil.longTo32Bytes; - @Slf4j public class AllowTvmLondonTest extends VMTestBase { From 5c9ef88157fc99aa10ed5067c747a164f0504ce1 Mon Sep 17 00:00:00 2001 From: Asuka Date: Wed, 1 Sep 2021 19:21:51 +0800 Subject: [PATCH 195/341] func(tvm): expand hash space for storage slot key --- .../main/java/org/tron/core/vm/program/Storage.java | 10 +++++++++- .../org/tron/core/vm/repository/RepositoryImpl.java | 7 +++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/vm/program/Storage.java b/actuator/src/main/java/org/tron/core/vm/program/Storage.java index 694917491fc..61eef46f4bd 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/Storage.java +++ b/actuator/src/main/java/org/tron/core/vm/program/Storage.java @@ -5,11 +5,13 @@ import java.util.HashMap; import java.util.Map; import lombok.Getter; +import lombok.Setter; import org.tron.common.crypto.Hash; import org.tron.common.runtime.vm.DataWord; import org.tron.common.utils.ByteUtil; import org.tron.core.capsule.StorageRowCapsule; import org.tron.core.store.StorageRowStore; +import org.tron.core.vm.config.VMConfig; public class Storage { @@ -22,6 +24,8 @@ public class Storage { private StorageRowStore store; @Getter private byte[] address; + @Setter + private int contractVersion; public Storage(byte[] address, StorageRowStore store) { addrHash = addrHash(address); @@ -33,13 +37,17 @@ public Storage(Storage storage) { this.addrHash = storage.addrHash.clone(); this.address = storage.getAddress().clone(); this.store = storage.store; + this.contractVersion = storage.contractVersion; storage.getRowCache().forEach((DataWord rowKey, StorageRowCapsule row) -> { StorageRowCapsule newRow = new StorageRowCapsule(row); this.rowCache.put(rowKey.clone(), newRow); }); } - private static byte[] compose(byte[] key, byte[] addrHash) { + private byte[] compose(byte[] key, byte[] addrHash) { + if (VMConfig.allowTvmCompatibleEvm() && contractVersion == 1) { + return Hash.sha3(ByteUtil.merge(addrHash, key)); + } byte[] result = new byte[key.length]; arraycopy(addrHash, 0, result, 0, PREFIX_BYTES); arraycopy(key, PREFIX_BYTES, result, PREFIX_BYTES, PREFIX_BYTES); diff --git a/actuator/src/main/java/org/tron/core/vm/repository/RepositoryImpl.java b/actuator/src/main/java/org/tron/core/vm/repository/RepositoryImpl.java index 75f1ee2c382..e3712594ff5 100644 --- a/actuator/src/main/java/org/tron/core/vm/repository/RepositoryImpl.java +++ b/actuator/src/main/java/org/tron/core/vm/repository/RepositoryImpl.java @@ -524,8 +524,11 @@ public Storage getStorage(byte[] address) { storage = new Storage(address, getStorageRowStore()); } ContractCapsule contract = getContract(address); - if (contract != null && !ByteUtil.isNullOrZeroArray(contract.getTrxHash())) { - storage.generateAddrHash(contract.getTrxHash()); + if (contract != null) { + storage.setContractVersion(contract.getContractVersion()); + if (!ByteUtil.isNullOrZeroArray(contract.getTrxHash())) { + storage.generateAddrHash(contract.getTrxHash()); + } } return storage; } From a8779452ed33436d747e62cbc7118313a880763d Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 2 Sep 2021 11:53:48 +0800 Subject: [PATCH 196/341] fix: transactionreceipt is success when result is 0 or 1 --- .../java/org/tron/core/services/jsonrpc/TransactionReceipt.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java index de4464758b0..2a6ecefba6c 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java @@ -72,7 +72,7 @@ public TransactionReceipt(Protocol.Block block, TransactionInfo txInfo, Wallet w transactionIndex = ByteArray.toJsonHex(index); cumulativeGasUsed = ByteArray.toJsonHex(cumulativeGas); gasUsed = ByteArray.toJsonHex(energyUsage); - status = resourceReceipt.getResultValue() == 1 ? "0x1" : "0x0"; + status = resourceReceipt.getResultValue() <= 1 ? "0x1" : "0x0"; transaction = block.getTransactions(index); break; From cdc5c9aaa8883ae3a718a3dbc96a014c0379d090 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 2 Sep 2021 12:22:58 +0800 Subject: [PATCH 197/341] fix: add removed to log --- .../java/org/tron/core/services/jsonrpc/TransactionReceipt.java | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java index 2a6ecefba6c..8ec2bef5a86 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java @@ -28,6 +28,7 @@ public static class TransactionLog { public String address; public String data; public String[] topics; + public boolean removed = false; public TransactionLog() { From f2beed5ba78078da1c68e7cb9324047227953a2a Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 2 Sep 2021 14:48:05 +0800 Subject: [PATCH 198/341] fix: add type to transaction --- .../java/org/tron/core/services/jsonrpc/TransactionReceipt.java | 2 ++ .../java/org/tron/core/services/jsonrpc/TransactionResult.java | 2 ++ .../java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java index 8ec2bef5a86..66d7819d3f5 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java @@ -52,6 +52,8 @@ public TransactionLog() { @JsonInclude(JsonInclude.Include.NON_NULL) public String status; // either 1 (success) or 0 (failure) (post Byzantium) + public String type = "0x0"; + public TransactionReceipt(Protocol.Block block, TransactionInfo txInfo, Wallet wallet) { BlockCapsule blockCapsule = new BlockCapsule(block); String txid = ByteArray.toHexString(txInfo.getId().toByteArray()); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java index 85f6be8c8ff..d84a0df3b6c 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java @@ -34,6 +34,8 @@ public class TransactionResult { public String r; public String s; + public String type = "0x0"; + private void parseSignature(Transaction tx) { ByteString signature = tx.getSignature(0); // r[32] + s[32] + v[1] byte[] signData = signature.toByteArray(); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index d4f14539b04..ff3e306d4f8 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -174,7 +174,7 @@ private BlockResult getBlockResult(Block block, boolean fullTx) { br.parentHash = ByteArray.toJsonHex(blockCapsule.getParentBlockId().getBytes()); br.nonce = null; // no value br.sha3Uncles = null; // no value - br.logsBloom = null; // no value + br.logsBloom = ByteArray.toJsonHex(new byte[256]); // no value br.transactionsRoot = ByteArray .toJsonHex(block.getBlockHeader().getRawData().getTxTrieRoot().toByteArray()); br.stateRoot = ByteArray From 2a80b842ce66d02de37236078da9639088f01669 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Fri, 3 Sep 2021 15:03:13 +0800 Subject: [PATCH 199/341] feat: modify coinbase and mining --- .../src/main/java/org/tron/core/Wallet.java | 77 ++++++++++++++++--- .../core/services/jsonrpc/CallArguments.java | 1 - .../core/services/jsonrpc/TronJsonRpc.java | 2 +- .../services/jsonrpc/TronJsonRpcImpl.java | 13 ++-- .../org/tron/core/jsonrpc/JsonRpcTest.java | 15 ++-- 5 files changed, 85 insertions(+), 23 deletions(-) diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index b8b90e1c2d4..774fcec60e3 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -102,7 +102,6 @@ import org.tron.common.crypto.SignUtils; import org.tron.common.overlay.discover.node.NodeHandler; import org.tron.common.overlay.discover.node.NodeManager; -import org.tron.common.overlay.message.Message; import org.tron.common.parameter.CommonParameter; import org.tron.common.runtime.ProgramResult; import org.tron.common.utils.ByteArray; @@ -510,14 +509,14 @@ public GrpcAPI.Return broadcastTransaction(Transaction signedTransaction) { if (dbManager.isTooManyPending()) { logger.warn("Broadcast transaction {} has failed, too many pending.", txID); return builder.setResult(false).setCode(response_code.SERVER_BUSY) - .setMessage(ByteString.copyFromUtf8("Server busy.")).build(); + .setMessage(ByteString.copyFromUtf8("Server busy.")).build(); } if (trxCacheEnable) { if (dbManager.getTransactionIdCache().getIfPresent(txID) != null) { logger.warn("Broadcast transaction {} has failed, it already exists.", txID); return builder.setResult(false).setCode(response_code.DUP_TRANSACTION_ERROR) - .setMessage(ByteString.copyFromUtf8("Transaction already exists.")).build(); + .setMessage(ByteString.copyFromUtf8("Transaction already exists.")).build(); } else { dbManager.getTransactionIdCache().put(txID, true); } @@ -530,7 +529,7 @@ public GrpcAPI.Return broadcastTransaction(Transaction signedTransaction) { int num = tronNetService.fastBroadcastTransaction(message); if (num == 0) { return builder.setResult(false).setCode(response_code.NOT_ENOUGH_EFFECTIVE_CONNECTION) - .setMessage(ByteString.copyFromUtf8("P2P broadcast failed.")).build(); + .setMessage(ByteString.copyFromUtf8("P2P broadcast failed.")).build(); } else { logger.info("Broadcast transaction {} to {} peers successfully.", txID, num); return builder.setResult(true).setCode(response_code.SUCCESS).build(); @@ -1400,7 +1399,7 @@ public TransactionInfo getTransactionInfoById(ByteString transactionId) { TransactionInfoCapsule transactionInfoCapsule; try { transactionInfoCapsule = chainBaseManager.getTransactionRetStore() - .getTransactionInfo(transactionId.toByteArray()); + .getTransactionInfo(transactionId.toByteArray()); } catch (StoreException e) { return null; } @@ -1409,7 +1408,7 @@ public TransactionInfo getTransactionInfoById(ByteString transactionId) { } try { transactionInfoCapsule = chainBaseManager.getTransactionHistoryStore() - .get(transactionId.toByteArray()); + .get(transactionId.toByteArray()); } catch (BadItemException e) { return null; } @@ -2672,11 +2671,11 @@ public SmartContract getContract(GrpcAPI.BytesMessage bytesMessage) { } /** - * Add a wrapper for smart contract. - * Current additional information including runtime code for a smart contract. + * Add a wrapper for smart contract. Current additional information including runtime code for a + * smart contract. + * * @param bytesMessage the contract address message * @return contract info - * */ public SmartContractDataWrapper getContractInfo(GrpcAPI.BytesMessage bytesMessage) { byte[] address = bytesMessage.getValue().toByteArray(); @@ -3873,6 +3872,66 @@ public long getEnergyFee(long timestamp) { } } + public String getCoinbase() { + if (!CommonParameter.getInstance().isWitness()) { + return null; + } + + // get local witnesses + List localPrivateKeys = Args.getLocalWitnesses().getPrivateKeys(); + List localWitnessAddresses = new ArrayList<>(); + for (String privateKey : localPrivateKeys) { + localWitnessAddresses.add(Hex.toHexString(SignUtils + .fromPrivate(ByteArray.fromHexString(privateKey), + CommonParameter.getInstance().isECKeyCryptoEngine()).getAddress())); + } + // get all witnesses + List witnesses = consensusDelegate.getAllWitnesses(); + List witnessAddresses = new ArrayList<>(); + for (WitnessCapsule witnessCapsule : witnesses) { + witnessAddresses.add(Hex.toHexString(witnessCapsule.getAddress().toByteArray())); + } + + // check if witnesses contains local witness + for (String localWitnessAddress : localWitnessAddresses) { + if (witnessAddresses.contains(localWitnessAddress)) { + return "0x" + localWitnessAddress; + } + } + + return null; + } + + public boolean isMining() { + if (!CommonParameter.getInstance().isWitness()) { + return false; + } + + // get local witnesses + List localPrivateKeys = Args.getLocalWitnesses().getPrivateKeys(); + List localWitnessAddresses = new ArrayList<>(); + for (String privateKey : localPrivateKeys) { + localWitnessAddresses.add(Hex.toHexString(SignUtils + .fromPrivate(ByteArray.fromHexString(privateKey), + CommonParameter.getInstance().isECKeyCryptoEngine()).getAddress())); + } + + // get active witnesses + List activeWitnesses = consensusDelegate.getActiveWitnesses(); + List activeWitnessAddresses = new ArrayList<>(); + for (ByteString activeWitness : activeWitnesses) { + activeWitnessAddresses.add(Hex.toHexString(activeWitness.toByteArray())); + } + + // check if active witnesses contains local witness + for (String localWitnessAddress : localWitnessAddresses) { + if (activeWitnessAddresses.contains(localWitnessAddress)) { + return true; + } + } + + return false; + } } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/CallArguments.java b/framework/src/main/java/org/tron/core/services/jsonrpc/CallArguments.java index c5232169545..dcb0dfe7d54 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/CallArguments.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/CallArguments.java @@ -4,7 +4,6 @@ import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.paramStringIsNull; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.parseQuantityValue; - import com.google.protobuf.ByteString; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 5db25a65b01..0007181f921 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -191,7 +191,7 @@ String getABIOfSmartContract(String contractAddress, String bnOrId) @JsonRpcMethod("eth_coinbase") @JsonRpcErrors({ - @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcInternalException.class, code = -32000, data = "{}"), }) String getCoinbase() throws JsonRpcInternalException; diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index ff3e306d4f8..2692c7f0a39 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -418,12 +418,13 @@ public String getABIOfSmartContract(String contractAddress, String blockNumOrTag @Override public String getCoinbase() throws JsonRpcInternalException { - byte[] witnessAddress = wallet.getNowBlock().getBlockHeader().getRawData().getWitnessAddress() - .toByteArray(); - if (witnessAddress == null || witnessAddress.length != 21) { - throw new JsonRpcInternalException("invalid witness address"); + String address = wallet.getCoinbase(); + + if (StringUtils.isEmpty(address)) { + throw new JsonRpcInternalException("etherbase must be explicitly specified"); } - return ByteArray.toJsonHexAddress(witnessAddress); + + return address; } // return energy fee @@ -682,7 +683,7 @@ public String getHashRate() { @Override public boolean isMining() { - return false; + return wallet.isMining(); } @Override diff --git a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java index 0d46405d72c..e08a138bb89 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java @@ -3,7 +3,6 @@ import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getMethodSign; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.parseEnergyFee; - import org.bouncycastle.util.encoders.Hex; import org.junit.Assert; import org.junit.Test; @@ -80,19 +79,23 @@ private String generateStorageParameter() { return sb.toString(); } - private String constractData(String functionSelector, String parameter) { + private String constructData(String functionSelector, String parameter) { String data = getMethodSign(functionSelector) + parameter; return data; } @Test - public void testConstractData() { + public void testConstructData() { String expectedData = - "07211ef70000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000f4240"; + "07211ef7000000000000000000000000000000000000000000000000000000000000000" + + "3000000000000000000000000000000000000000000000000000000000000000100" + + "000000000000000000000000000000000000000000000000000000000f4240"; String functionSelector = "get_dy_underlying(int128,int128,uint256)"; - String parameter = "0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000f4240"; - Assert.assertEquals(expectedData, constractData(functionSelector, parameter)); + String parameter = "000000000000000000000000000000000000000000000000000000000" + + "00000030000000000000000000000000000000000000000000000000000000000000001" + + "00000000000000000000000000000000000000000000000000000000000f4240"; + Assert.assertEquals(expectedData, constructData(functionSelector, parameter)); } @Test From 753010d6ff8138acc2c2cae1827e450fda182bf7 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Fri, 3 Sep 2021 15:32:03 +0800 Subject: [PATCH 200/341] feat: put pending as invalid --- framework/src/main/java/org/tron/core/Wallet.java | 4 ++-- .../org/tron/core/services/jsonrpc/TransactionResult.java | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index 774fcec60e3..9e5e948744e 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -691,7 +691,7 @@ public Block getByJsonBlockId(String id) throws JsonRpcInvalidParamsException { } else if ("latest".equalsIgnoreCase(id)) { return getNowBlock(); } else if ("pending".equalsIgnoreCase(id)) { - return null; + throw new JsonRpcInvalidParamsException("TAG pending not supported"); } else { long blockNumber; try { @@ -707,7 +707,7 @@ public Block getByJsonBlockId(String id) throws JsonRpcInvalidParamsException { public List getTransactionsByJsonBlockId(String id) throws JsonRpcInvalidParamsException { if ("pending".equalsIgnoreCase(id)) { - return null; + throw new JsonRpcInvalidParamsException("TAG pending not supported"); } else { Block block = getByJsonBlockId(id); return block != null ? block.getTransactionsList() : null; diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java index d84a0df3b6c..f5b11592a31 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java @@ -37,6 +37,14 @@ public class TransactionResult { public String type = "0x0"; private void parseSignature(Transaction tx) { + + if (tx.getSignatureCount() == 0) { + v = null; + r = null; + s = null; + return; + } + ByteString signature = tx.getSignature(0); // r[32] + s[32] + v[1] byte[] signData = signature.toByteArray(); byte[] rByte = Arrays.copyOfRange(signData, 0, 32); From b96ff29578415ecc82d606d6a8fbbc32ddfd65fc Mon Sep 17 00:00:00 2001 From: sophiawang <1975054324@qq.com> Date: Fri, 3 Sep 2021 15:48:54 +0800 Subject: [PATCH 201/341] adapt case to java-tron v4.4.0 --- .../assetmarket/MarketSellAsset002.java | 10 ++-- .../assetmarket/MarketSellAsset003.java | 39 +++++++------- .../trctoken/ContractTrcToken003.java | 52 ++++++++++--------- .../trctoken/ContractTrcToken005.java | 3 +- 4 files changed, 55 insertions(+), 49 deletions(-) diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/assetmarket/MarketSellAsset002.java b/framework/src/test/java/stest/tron/wallet/dailybuild/assetmarket/MarketSellAsset002.java index 95082986179..d145a540f20 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/assetmarket/MarketSellAsset002.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/assetmarket/MarketSellAsset002.java @@ -203,7 +203,7 @@ void marketSellAssetTest002() { // get order Message and RemainSellTokenQuantity MarketOrder order001 = PublicMethed .getMarketOrderById(orderId, blockingStubFull).get(); - Assert.assertEquals(order001.getSellTokenQuantityRemain(),sellTokenQuantity); + Assert.assertEquals(order001.getSellTokenQuantityRemain(), sellTokenQuantity); Map afterAsset001 = PublicMethed.queryAccount(testAddress001, blockingStubFull) .getAssetV2Map(); @@ -238,7 +238,7 @@ void marketSellAssetTest002() { // get order Message and RemainSellTokenQuantity order001 = PublicMethed .getMarketOrderById(orderId, blockingStubFull).get(); - Assert.assertEquals(order001.getSellTokenQuantityRemain(),0); + Assert.assertEquals(order001.getSellTokenQuantityRemain(), 0); afterAsset001 = PublicMethed.queryAccount(testAddress001, blockingStubFull) .getAssetV2Map(); @@ -340,7 +340,7 @@ void marketSellAssetTest004() { tokenId = orderList.get().getOrders(0).getSellTokenId().toByteArray(); sellTokenQuantity001 = orderList.get().getOrders(0).getSellTokenQuantityRemain(); - String txid = PublicMethed.marketCancelOrder(testAddress001,testKey001,orderId001, + String txid = PublicMethed.marketCancelOrder(testAddress001, testKey001, orderId001, blockingStubFull); PublicMethed.waitProduceNextBlock(blockingStubFull); Assert.assertNotNull(txid); @@ -365,8 +365,8 @@ void marketSellAssetTest004() { PublicMethed.waitProduceNextBlock(blockingStubFull); Assert.assertNotNull(response); Assert.assertEquals(response.getCode(), response_code.CONTRACT_VALIDATE_ERROR); - Assert.assertEquals(ByteArray.toStr(response.getMessage().toByteArray()), - "contract validate error : Order is not active!"); + Assert.assertEquals(ByteArray.toStr(response.getMessage().toByteArray()).toLowerCase(), + "contract validate error : Order is not active!".toLowerCase()); } diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/assetmarket/MarketSellAsset003.java b/framework/src/test/java/stest/tron/wallet/dailybuild/assetmarket/MarketSellAsset003.java index 51cdc78d824..fb7e2898dd2 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/assetmarket/MarketSellAsset003.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/assetmarket/MarketSellAsset003.java @@ -63,21 +63,23 @@ public void beforeClass() { PublicMethed.printAddress(testKey001); PublicMethed.printAddress(testKey002); - Assert.assertTrue(PublicMethed.sendcoin(testAddress001,20000_000000L,foundationAddress001, - foundationKey001,blockingStubFull)); - Assert.assertTrue(PublicMethed.sendcoin(testAddress002,20000_000000L,foundationAddress001, - foundationKey001,blockingStubFull)); + Assert.assertTrue(PublicMethed.sendcoin(testAddress001, 20000_000000L, foundationAddress001, + foundationKey001, blockingStubFull)); + Assert.assertTrue(PublicMethed.sendcoin(testAddress002, 20000_000000L, foundationAddress001, + foundationKey001, blockingStubFull)); PublicMethed.waitProduceNextBlock(blockingStubFull); Long start = System.currentTimeMillis() + 5000; Long end = System.currentTimeMillis() + 1000000000; - Assert.assertTrue(PublicMethed.createAssetIssue(testAddress001,name,10000_000000L,1,1,start, - end,1,description,url,10000L,10000L,1L, 1L,testKey001,blockingStubFull)); + Assert.assertTrue(PublicMethed.createAssetIssue(testAddress001, name, 10000_000000L, + 1, 1, start, end, 1, description, url, 10000L, + 10000L, 1L, 1L, testKey001, blockingStubFull)); start = System.currentTimeMillis() + 5000; end = System.currentTimeMillis() + 1000000000; - Assert.assertTrue(PublicMethed.createAssetIssue(testAddress002,name,10000_000000L,1,1,start, - end,1,description,url,10000L,10000L,1L, 1L,testKey002,blockingStubFull)); + Assert.assertTrue(PublicMethed.createAssetIssue(testAddress002, name, 10000_000000L, + 1, 1, start, end, 1, description, url, 10000L, + 10000L, 1L, 1L, testKey002, blockingStubFull)); PublicMethed.waitProduceNextBlock(blockingStubFull); assetAccountId001 = PublicMethed.queryAccount(testAddress001, blockingStubFull) @@ -88,11 +90,11 @@ public void beforeClass() { } - @Test(enabled = true,description = "CancelOrder") + @Test(enabled = true, description = "CancelOrder") void marketCancelAssetTest001() { - String txid = PublicMethed.marketSellAsset(testAddress001,testKey001,assetAccountId001,100, - trx,50,blockingStubFull); + String txid = PublicMethed.marketSellAsset(testAddress001, testKey001, assetAccountId001, 100, + trx, 50, blockingStubFull); PublicMethed.waitProduceNextBlock(blockingStubFull); Optional transaction = PublicMethed .getTransactionById(txid, blockingStubFull); @@ -104,7 +106,7 @@ void marketCancelAssetTest001() { PublicMethed.waitProduceNextBlock(blockingStubFull); Assert.assertTrue(orderList.get().getOrdersCount() > 0); byte[] orderId = orderList.get().getOrders(0).getOrderId().toByteArray(); - txid = PublicMethed.marketCancelOrder(testAddress001,testKey001,orderId,blockingStubFull); + txid = PublicMethed.marketCancelOrder(testAddress001, testKey001, orderId, blockingStubFull); PublicMethed.waitProduceNextBlock(blockingStubFull); transaction = PublicMethed @@ -117,11 +119,11 @@ void marketCancelAssetTest001() { } - @Test(enabled = true,description = "Cancel a cancelled order ") + @Test(enabled = true, description = "Cancel a cancelled order ") void marketCancelAssetTest002() { - String txid = PublicMethed.marketSellAsset(testAddress001,testKey001,assetAccountId001,100, - trx,50,blockingStubFull); + String txid = PublicMethed.marketSellAsset(testAddress001, testKey001, assetAccountId001, 100, + trx, 50, blockingStubFull); PublicMethed.waitProduceNextBlock(blockingStubFull); Optional transaction = PublicMethed .getTransactionById(txid, blockingStubFull); @@ -133,7 +135,7 @@ void marketCancelAssetTest002() { PublicMethed.waitProduceNextBlock(blockingStubFull); Assert.assertTrue(orderList.get().getOrdersCount() > 0); byte[] orderId = orderList.get().getOrders(0).getOrderId().toByteArray(); - txid = PublicMethed.marketCancelOrder(testAddress001,testKey001,orderId,blockingStubFull); + txid = PublicMethed.marketCancelOrder(testAddress001, testKey001, orderId, blockingStubFull); PublicMethed.waitProduceNextBlock(blockingStubFull); transaction = PublicMethed @@ -143,8 +145,9 @@ void marketCancelAssetTest002() { .getMarketOrderByAccount(testAddress001, blockingStubFull); Assert.assertTrue(orderList.get().getOrdersCount() == 0); - Assert.assertEquals(PublicMethed.marketCancelOrder(testAddress001,testKey001,orderId, - blockingStubFull),"contract validate error : Order is not active!"); + Assert.assertEquals(PublicMethed.marketCancelOrder(testAddress001, testKey001, orderId, + blockingStubFull).toLowerCase(), + "contract validate error : Order is not active!".toLowerCase()); } diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/trctoken/ContractTrcToken003.java b/framework/src/test/java/stest/tron/wallet/dailybuild/trctoken/ContractTrcToken003.java index 9fdafd94f68..51e9b107905 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/trctoken/ContractTrcToken003.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/trctoken/ContractTrcToken003.java @@ -152,7 +152,8 @@ public void deployTransferTokenContract() { Assert.assertFalse(response.getResult()); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, response.getCode()); Assert - .assertEquals("contract validate error : No asset !", response.getMessage().toStringUtf8()); + .assertEquals("contract validate error : No asset !".toLowerCase(), + response.getMessage().toStringUtf8().toLowerCase()); // deployer didn't have any such token fakeTokenId = assetAccountUser.toStringUtf8(); @@ -164,8 +165,8 @@ public void deployTransferTokenContract() { Assert.assertFalse(response.getResult()); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, response.getCode()); - Assert.assertEquals("contract validate error : assetBalance must greater than 0.", - response.getMessage().toStringUtf8()); + Assert.assertEquals("contract validate error : assetBalance must greater than 0.".toLowerCase(), + response.getMessage().toStringUtf8().toLowerCase()); // deployer didn't have any Long.MAX_VALUE fakeTokenId = Long.toString(Long.MAX_VALUE); @@ -177,8 +178,8 @@ public void deployTransferTokenContract() { Assert.assertFalse(response.getResult()); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, response.getCode()); - Assert - .assertEquals("contract validate error : No asset !", response.getMessage().toStringUtf8()); + Assert.assertEquals("contract validate error : No asset !".toLowerCase(), + response.getMessage().toStringUtf8().toLowerCase()); // the tokenValue is not enough fakeTokenId = assetAccountDev.toStringUtf8(); @@ -190,8 +191,8 @@ public void deployTransferTokenContract() { Assert.assertFalse(response.getResult()); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, response.getCode()); - Assert.assertEquals("contract validate error : assetBalance is not sufficient.", - response.getMessage().toStringUtf8()); + Assert.assertEquals("contract validate error : assetBalance is not sufficient.".toLowerCase(), + response.getMessage().toStringUtf8().toLowerCase()); // tokenid is -1 fakeTokenId = Long.toString(-1); @@ -201,8 +202,8 @@ public void deployTransferTokenContract() { Assert.assertFalse(response.getResult()); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, response.getCode()); - Assert.assertEquals("contract validate error : tokenId must be > 1000000", - response.getMessage().toStringUtf8()); + Assert.assertEquals("contract validate error : tokenId must be > 1000000".toLowerCase(), + response.getMessage().toStringUtf8().toLowerCase()); PublicMethed.waitProduceNextBlock(blockingStubFull); @@ -214,8 +215,8 @@ public void deployTransferTokenContract() { Assert.assertFalse(response.getResult()); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, response.getCode()); - Assert.assertEquals("contract validate error : tokenId must be > 1000000", - response.getMessage().toStringUtf8()); + Assert.assertEquals("contract validate error : tokenId must be > 1000000".toLowerCase(), + response.getMessage().toStringUtf8().toLowerCase()); // tokenid is Long.MIN_VALUE fakeTokenId = Long.toString(Long.MIN_VALUE); @@ -225,8 +226,8 @@ public void deployTransferTokenContract() { Assert.assertFalse(response.getResult()); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, response.getCode()); - Assert.assertEquals("contract validate error : tokenId must be > 1000000", - response.getMessage().toStringUtf8()); + Assert.assertEquals("contract validate error : tokenId must be > 1000000".toLowerCase(), + response.getMessage().toStringUtf8().toLowerCase()); PublicMethed.waitProduceNextBlock(blockingStubFull); @@ -240,8 +241,9 @@ public void deployTransferTokenContract() { Assert.assertFalse(response.getResult()); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, response.getCode()); Assert.assertEquals( - "contract validate error : invalid arguments with tokenValue = 100, tokenId = 0", - response.getMessage().toStringUtf8()); + ("contract validate error : invalid arguments " + + "with tokenValue = 100, tokenId = 0").toLowerCase(), + response.getMessage().toStringUtf8().toLowerCase()); // tokenvalue is less than 0 fakeTokenValue = -1L; @@ -253,8 +255,8 @@ public void deployTransferTokenContract() { Assert.assertFalse(response.getResult()); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, response.getCode()); - Assert.assertEquals("contract validate error : tokenValue must be >= 0", - response.getMessage().toStringUtf8()); + Assert.assertEquals("contract validate error : tokenValue must be >= 0".toLowerCase(), + response.getMessage().toStringUtf8().toLowerCase()); PublicMethed.waitProduceNextBlock(blockingStubFull); @@ -268,8 +270,8 @@ public void deployTransferTokenContract() { Assert.assertFalse(response.getResult()); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, response.getCode()); - Assert.assertEquals("contract validate error : tokenValue must be >= 0", - response.getMessage().toStringUtf8()); + Assert.assertEquals("contract validate error : tokenValue must be >= 0".toLowerCase(), + response.getMessage().toStringUtf8().toLowerCase()); String tokenId = Long.toString(-1); long tokenValue = 0; @@ -281,8 +283,8 @@ public void deployTransferTokenContract() { Assert.assertFalse(response.getResult()); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, response.getCode()); - Assert.assertEquals("contract validate error : tokenId must be > 1000000", - response.getMessage().toStringUtf8()); + Assert.assertEquals("contract validate error : tokenId must be > 1000000".toLowerCase(), + response.getMessage().toStringUtf8().toLowerCase()); PublicMethed.waitProduceNextBlock(blockingStubFull); @@ -296,8 +298,8 @@ public void deployTransferTokenContract() { Assert.assertFalse(response.getResult()); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, response.getCode()); - Assert.assertEquals("contract validate error : tokenId must be > 1000000", - response.getMessage().toStringUtf8()); + Assert.assertEquals("contract validate error : tokenId must be > 1000000".toLowerCase(), + response.getMessage().toStringUtf8().toLowerCase()); PublicMethed.waitProduceNextBlock(blockingStubFull); @@ -311,8 +313,8 @@ public void deployTransferTokenContract() { Assert.assertFalse(response.getResult()); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, response.getCode()); - Assert.assertEquals("contract validate error : tokenId must be > 1000000", - response.getMessage().toStringUtf8()); + Assert.assertEquals("contract validate error : tokenId must be > 1000000".toLowerCase(), + response.getMessage().toStringUtf8().toLowerCase()); accountResource = PublicMethed.getAccountResource(dev001Address, blockingStubFull); energyLimit = accountResource.getEnergyLimit(); diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/trctoken/ContractTrcToken005.java b/framework/src/test/java/stest/tron/wallet/dailybuild/trctoken/ContractTrcToken005.java index 7d3b7d5fd79..f318aa23189 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/trctoken/ContractTrcToken005.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/trctoken/ContractTrcToken005.java @@ -216,7 +216,8 @@ public void deployTransferTokenContract() { Assert.assertFalse(response.getResult()); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, response.getCode()); Assert - .assertEquals("contract validate error : No asset !", response.getMessage().toStringUtf8()); + .assertEquals("contract validate error : No asset !".toLowerCase(), + response.getMessage().toStringUtf8().toLowerCase()); // not have this tokenId tokenId = assetAccountId.toStringUtf8(); From c81d446fc4c1df3402591eef88dbe236445849ef Mon Sep 17 00:00:00 2001 From: neo hong Date: Fri, 3 Sep 2021 16:22:01 +0800 Subject: [PATCH 202/341] modify version --- common/src/main/java/org/tron/core/config/Parameter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/org/tron/core/config/Parameter.java b/common/src/main/java/org/tron/core/config/Parameter.java index 6548fd4d2a8..386289436f7 100644 --- a/common/src/main/java/org/tron/core/config/Parameter.java +++ b/common/src/main/java/org/tron/core/config/Parameter.java @@ -65,7 +65,7 @@ public class ChainConstant { public static final int SINGLE_REPEAT = 1; public static final int BLOCK_FILLED_SLOTS_NUMBER = 128; public static final int MAX_FROZEN_NUMBER = 1; - public static final int BLOCK_VERSION = 22; + public static final int BLOCK_VERSION = 23; public static final long FROZEN_PERIOD = 86_400_000L; public static final long TRX_PRECISION = 1000_000L; } From ceec7375047191863f1c3baca0d764f97bc45aa7 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Fri, 3 Sep 2021 16:58:39 +0800 Subject: [PATCH 203/341] feat: use getcontractinfo to get runtimecode --- .../org/tron/core/services/jsonrpc/TronJsonRpcImpl.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 2692c7f0a39..5d61db569d7 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -59,6 +59,7 @@ import org.tron.protos.contract.SmartContractOuterClass.CreateSmartContract; import org.tron.protos.contract.SmartContractOuterClass.SmartContract; import org.tron.protos.contract.SmartContractOuterClass.SmartContract.ABI; +import org.tron.protos.contract.SmartContractOuterClass.SmartContractDataWrapper; import org.tron.protos.contract.SmartContractOuterClass.TriggerSmartContract; @Slf4j(topic = "API") @@ -397,10 +398,10 @@ public String getABIOfSmartContract(String contractAddress, String blockNumOrTag BytesMessage.Builder build = BytesMessage.newBuilder(); BytesMessage bytesMessage = build.setValue(ByteString.copyFrom(addressData)).build(); - SmartContract smartContract = wallet.getContract(bytesMessage); + SmartContractDataWrapper contractDataWrapper = wallet.getContractInfo(bytesMessage); - if (smartContract != null) { - return ByteArray.toJsonHex(smartContract.getBytecode().toByteArray()); + if (contractDataWrapper != null) { + return ByteArray.toJsonHex(contractDataWrapper.getRuntimecode().toByteArray()); } else { return "0x"; } From 05a09706f528436fe2a34fa67bb6428404d0e9d0 Mon Sep 17 00:00:00 2001 From: sophiawang <1975054324@qq.com> Date: Fri, 3 Sep 2021 17:55:53 +0800 Subject: [PATCH 204/341] fix checkstyle --- .../tron/wallet/dailybuild/trctoken/ContractTrcToken003.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/trctoken/ContractTrcToken003.java b/framework/src/test/java/stest/tron/wallet/dailybuild/trctoken/ContractTrcToken003.java index 51e9b107905..ee46fba9c39 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/trctoken/ContractTrcToken003.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/trctoken/ContractTrcToken003.java @@ -241,8 +241,8 @@ public void deployTransferTokenContract() { Assert.assertFalse(response.getResult()); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, response.getCode()); Assert.assertEquals( - ("contract validate error : invalid arguments " + - "with tokenValue = 100, tokenId = 0").toLowerCase(), + ("contract validate error : invalid arguments " + + "with tokenValue = 100, tokenId = 0").toLowerCase(), response.getMessage().toStringUtf8().toLowerCase()); // tokenvalue is less than 0 From ea7b86d6373fc82161fd5bb2e60241cda5466cb2 Mon Sep 17 00:00:00 2001 From: liukai Date: Fri, 3 Sep 2021 18:11:39 +0800 Subject: [PATCH 205/341] optimize start.sh --- start.sh | 370 +++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 236 insertions(+), 134 deletions(-) diff --git a/start.sh b/start.sh index 1e30e19b727..6c4d16dd500 100644 --- a/start.sh +++ b/start.sh @@ -1,172 +1,274 @@ #!/bin/bash -APP=$1 -ALL_OPT=$* -NEED_REBUILD=0 -ALL_ARR_OPT=($@) -ALL_OPT_NUM=$# - -if [[ $1 == '--rewrite--manifest' ]] || [[ $1 == '--r' ]] ; then - APP='' - NEED_REBUILD=1 - elif [[ $2 == '--rewrite--manifest' ]] || [[ $2 == '--r' ]] ; then - NEED_REBUILD=1 -fi +# build FullNode config +FULL_NODE_DIR="FullNode" +FULL_NODE_CONFIG="main_net_config.conf" +FULL_NODE_SHELL="start.sh" +JAR_NAME="FullNode.jar" +FULL_START_OPT=$(echo ${@:2}) -rebuildManifest() { - if [[ $NEED_REBUILD == 1 ]] ; then - buildManifest - fi -} +# start service option +MAX_STOP_TIME=60 +# modify this option to allow the minimum memory to be started, unit MB +ALLOW_MIN_MEMORY=8000 +SPECIFY_MEMORY=0 +RUN=false +UPGRADE=false -buildManifest() { - ARCHIVE_JAR='ArchiveManifest.jar' - if [[ -f $archive_jar ]] ; then - java -jar $archive_jar $all_opt - else - echo 'download archivemanifest.jar' - download=`wget https://github.com/tronprotocol/java-tron/releases/download/greatvoyage-v4.3.0/archivemanifest.jar` - if [[ $download == 0 ]] ; then - echo 'download success, rebuild manifest' - java -jar $archive_jar $all_opt +# rebuild manifest +REBUILD_MANIFEST=true +REBUILD_DIR="$PWD/output-directory/database" +REBUILD_MANIFEST_SIZE=0 +REBUILD_BATCH_SIZE=80000 + +getLatestReleaseVersion() { + default_version='GreatVoyage-v4.3.0' + full_node_version=`git ls-remote --tags git@github.com:tronprotocol/java-tron.git |grep GreatVoyage- | awk -F '/' 'END{print $3}'` + if [[ -n $full_node_version ]]; then + echo "latest release version: $full_node_version" + return $full_node_version + else + echo "default version: " $default_version + return $default_version fi - fi +} - ret=$? - if [[ $ret == 0 ]] ; then - echo 'rebuild manifest success' +checkVersion() { + local_full_node_version='' + github_release_version=getLatestReleaseVersion + if [[ $local_full_node_version -ne $github_release_version ]]; then + echo "local version: $local_full_node_version, remote latest version: $github_release_version" + return $github_release_version else - echo 'rebuild manifest fail, log in logs/archive.log' + return $local_full_node_version fi - return ret } -checkmemory() { - allow_memory=8000000 - allow_max_memory=48000000 - max_matespace_size=' -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m ' - total=`cat /proc/meminfo |grep MemTotal |awk -F ' ' '{print $2}'` - default_memory=true - - position=0 - for param in $ALL_ARR_OPT - do - if [[ $param == '-mem' ]]; then - arr_index=$[position+1] - memory=${ALL_ARR_OPT[position+1]} - echo 'input direct memory:' $memory'MB' - memory=$[memory * 1000] - if [[ $memory =~ ^[0-9]*$ ]] && [[ $memory -gt $allow_memory ]]; then - allow_memory=$memory - default_memory=false - else - echo "direct memory must be greater than $allow_memory!, current memory: $total!!" - fi - fi - position=$[position+1] - done - - if [ $default_memory == true ]; then - if [[ $total -lt $allow_memory ]] ; then - echo "direct memory must be greater than $allow_memory!, current memory: $total!!" - exit - fi - if [[ $total -gt $allow_memory ]] && [[ $total -lt $allow_max_memory ]] ; then - max_new_size=' -XX:NewSize=3072m -XX:MaxNewSize=3072m ' - MEM_OPT="$max_matespace_size $max_new_size" +upgrade(latest_version) { + if [[ -n $latest_version ]]; then + //备份 + old_jar=$PWD/$JAR_NAME + if [[ -f $old_jar ]];then + mv $PWD/$JAR_NAME $PWD/$JAR_NAME'_bak' + if - elif [[ $total -gt $allow_memory ]] ; then - new_ratio=' -XX:NewSize=6144m -XX:MaxNewSize=6144m ' - MEM_OPT="$max_matespace_size $new_ratio" - else - new_ratio=' -XX:NewRatio=2 ' + is_download=$(wget -q https://github.com/tronprotocol/java-tron/releases/download/$latest_version/$JAR_NAME) + if [[ $is_download == 0 ]]; then + echo "download version $latest_version success" + fi fi - else - MEM_OPT=' -XX:NewRatio=2 ' - fi } -checkAppName() { - if [[ $APP =~ '-' ]]; then - APP='' - fi - APP=${APP:-"FullNode"} - START_OPT=`echo ${@:2}` - JAR_NAME="$APP.jar" - MAX_STOP_TIME=60 - MEM_OPT='' -} +download() { + if type wget >/dev/null 2>&1; then + full_node_version=getLatestReleaseVersion + if [ ! -d "$FULL_NODE_DIR" ]; then + echo "mkdir $FULL_NODE_DIR" + mkdir $FULL_NODE_DIR + cd $FULL_NODE_DIR + elif [ -d "$FULL_NODE_DIR" ]; then + cd $FULL_NODE_DIR + fi + echo 'execute download config' + config_file=$(wget -q https://raw.githubusercontent.com/tronprotocol/tron-deployment/master/$FULL_NODE_CONFIG) + sh_file=$(wget -q https://raw.githubusercontent.com/tronprotocol/java-tron/master/$FULL_NODE_SHELL) + full_node=$(wget -q https://github.com/tronprotocol/java-tron/releases/download/$full_node_version/$JAR_NAME) -checkpid() { - pid=`ps -ef | grep $JAR_NAME |grep -v grep | awk '{print $2}'` - return $pid -} + if [[ $full_node == 0 ]]; then + echo "download $JAR_NAME success" + fi -checkPathAndRebuild(){ - path='output-directory/database' - flag=1 - for p in ${ALL_OPT} - do - if [[ $flag == 0 ]] ; then - path=`echo $p` - break - fi - if [[ $p == '-d' || $p == '--database-directory' ]] ; then - path='' - flag=0 - fi - done + if [[ $sh_file == 0 ]]; then + chmod u+rwx start.sh + echo "download $FULL_NODE_SHELL success" + fi - if [[ -z "${path}" ]]; then - echo '-d /path or --database-directory /path' - exit -1 + if [[ $config_file == 0 ]]; then + echo "download $FULL_NODE_CONFIG success" + fi + else + echo 'no exists wget, make sure the system can use the "wget" command' fi +} - if [[ -d ${path} ]]; then - rebuildManifest +cloneCode() { + if type git >/dev/null 2>&1; then + git_clone=$(git clone -b master git@github.com:tronprotocol/java-tron.git) + if [[ git_clone == 0 ]]; then + echo 'git clone java-tron success' + fi else - echo $path 'not exist' - exit -1 + echo 'no exists git, make sure the system can use the "git" command' + fi +} + +cloneBuild() { + clone=$(cloneCode) + if [[ $clone == 0 ]]; then + cd 'java-tron' + echo "build java-tron" + sh gradlew clean build -x test fi } +checkPid() { + pid=$(ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}') + return $pid +} + stopService() { - checkAppName count=1 while [ $count -le $MAX_STOP_TIME ]; do - checkpid + checkPid if [ $pid ]; then - kill -15 $pid - sleep 1 + kill -15 $pid + sleep 1 else - echo "java-tron stop" - return + echo "java-tron stop" + return fi - count=$[$count+1] + count=$(($count + 1)) if [ $count -eq $MAX_STOP_TIME ]; then kill -9 $pid sleep 1 fi done + sleep 5 +} + +checkAllowMemory() { + if [[ $SPECIFY_MEMORY -gt 0 ]] && + [[ $SPECIFY_MEMORY -lt $ALLOW_MIN_MEMORY ]]; then + echo "warn: the specified memory $SPECIFY_MEMORY MB cannot be smaller than the minimum memory $ALLOW_MIN_MEMORY MB" + echo 'start abort' + exit + fi +} + +setTCMalloc() { + libtcmalloc="/usr/lib64/libtcmalloc.so" + if [[ -f $libtcmalloc ]]; then + export LD_PRELOAD="$libtcmalloc" + export TCMALLOC_RELEASE_RATE=10 + else + echo 'recommended for linux systems using tcmalloc as the default memory management tool' + fi } startService() { - checkmemory - - echo `date` >> start.log - total=`cat /proc/meminfo |grep MemTotal |awk -F ' ' '{print $2}'` - xmx=`echo "$total/1024/1024*0.6" | bc |awk -F. '{print $1"g"}'` - directmem=`echo "$total/1024/1024*0.1" | bc |awk -F. '{print $1"g"}'` - logtime=`date +%Y-%m-%d_%H-%M-%S` - export LD_PRELOAD="/usr/lib64/libtcmalloc.so" - export TCMALLOC_RELEASE_RATE=10 - nohup java -Xms$xmx -Xmx$xmx -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -Xloggc:./gc.log\ - -XX:+PrintGCDateStamps -XX:+CMSParallelRemarkEnabled -XX:ReservedCodeCacheSize=256m -XX:+UseCodeCacheFlushing\ - $MEM_OPT -XX:MaxDirectMemorySize=$directmem -XX:+HeapDumpOnOutOfMemoryError -jar $JAR_NAME $START_OPT -c config.conf >> start.log 2>&1 & - pid=`ps -ef |grep $JAR_NAME |grep -v grep |awk '{print $2}'` - echo "start java-tron with pid $pid on $HOSTNAME" + setTCMalloc + echo $(date) >>start.log + total=$(cat /proc/meminfo | grep MemTotal | awk -F ' ' '{print $2}') + xmx=$(echo "$total/1024/1024*0.6" | bc | awk -F. '{print $1"g"}') + directmem=$(echo "$total/1024/1024*0.1" | bc | awk -F. '{print $1"g"}') + logtime=$(date +%Y-%m-%d_%H-%M-%S) + nohup java -Xms$xmx -Xmx$xmx -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -Xloggc:./gc.log \ + -XX:+PrintGCDateStamps -XX:+CMSParallelRemarkEnabled -XX:ReservedCodeCacheSize=256m -XX:+UseCodeCacheFlushing \ + -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m \ + -XX:MaxDirectMemorySize=$directmem -XX:+HeapDumpOnOutOfMemoryError \ + -XX:NewRatio=2 -jar \ + $JAR_NAME $FULL_START_OPT -c config.conf >>start.log 2>&1 & + pid=$(ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}') + echo "start java-tron with pid $pid on $HOSTNAME" } -stopService -checkPathAndRebuild -sleep 5 -startService \ No newline at end of file +rebuildManifest() { + if [[ "$REBUILD_MANIFEST" = false ]]; then + echo 'disable rebuild manifest!' + return + fi + + if [[ ! -d $REBUILD_DIR ]]; then + echo "$REBUILD_DIR not exists, skip rebuild manifest" + return + fi + + ARCHIVE_JAR='ArchiveManifest.jar' + if [[ -f $ARCHIVE_JAR ]]; then + echo 'execute rebuild manifest.' + java -jar $ARCHIVE_JAR -d $REBUILD_DIR -m $REBUILD_MANIFEST_SIZE -b $REBUILD_BATCH_SIZE + else + echo 'download the rebuild manifest plugin from the github' + download=$(wget -q https://github.com/tronprotocol/java-tron/releases/download/GreatVoyage-v4.3.0/$ARCHIVE_JAR) + if [[ $download == 0 ]]; then + echo 'download success, rebuild manifest' + java -jar $ARCHIVE_JAR $REBUILD_DIR -m $REBUILD_MANIFEST_SIZE -b $REBUILD_BATCH_SIZE + fi + fi + if [[ $? == 0 ]]; then + echo 'rebuild manifest success' + else + echo 'rebuild manifest fail, log in logs/archive.log' + fi +} + +restart() { + stopService + checkAllowMemory + rebuildManifest + startService +} + +while [ -n "$1" ]; do + case "$1" in + -d) + REBUILD_DIR=$2/database + shift 2 + ;; + -m) + REBUILD_MANIFEST_SIZE=$2 + shift 2 + ;; + -b) + REBUILD_BATCH_SIZE=$2 + shift 2 + ;; + --download) + download + exit + ;; + --clone) + cloneCode + exit + ;; + --cb) + cloneBuild + exit + ;; + --mem) + SPECIFY_MEMORY=$2 + shift 2 + ;; + --disable-rewrite-manifes) + REBUILD_MANIFEST=false + shift 1 + ;; + --dr) + REBUILD_MANIFEST=false + shift 1 + ;; + --upgrade) + UPGRADE=true + shift 1 + ;; + --run) + RUN=true + shift 1 + ;; + *) + echo "warn: option $1 does not exist" + exit + ;; + esac +done + +if [[ $UPGRADE = true ]]; then + latest_version=checkVersion + upgrade($latest_version) +fi + +if [[ $RUN = true ]]; then + restart + exit +fi + +restart \ No newline at end of file From 10a3c02794028ee7b98960ea263056be9fbe5cba Mon Sep 17 00:00:00 2001 From: liukai Date: Fri, 3 Sep 2021 18:12:16 +0800 Subject: [PATCH 206/341] optimize start.sh --- quickstart.sh | 65 --------------------------------------------------- 1 file changed, 65 deletions(-) delete mode 100644 quickstart.sh diff --git a/quickstart.sh b/quickstart.sh deleted file mode 100644 index a5bf70879e0..00000000000 --- a/quickstart.sh +++ /dev/null @@ -1,65 +0,0 @@ -#!/bin/bash -START_OPT=$1 -FULL_NODE_DIR="FullNode" -FULL_NODE_VERSION="GreatVoyage-v4.3.0" - -download() { - if [ ! -d "$FULL_NODE_DIR" ]; then - mkdir $FULL_NODE_DIR - cd $FULL_NODE_DIR - elif [ -d "$FULL_NODE_DIR" ]; then - cd $FULL_NODE_DIR - fi - - if type wget >/dev/null 2>&1; then - config_file=$(wget https://raw.githubusercontent.com/tronprotocol/java-tron/develop/framework/src/main/resources/config.conf) - sh_file=$(wget https://raw.githubusercontent.com/tronprotocol/java-tron/develop/start.sh) - full_node=$(wget https://github.com/tronprotocol/java-tron/releases/download/$FULL_NODE_VERSION/FullNode.jar) - - if [[ $full_node == 0 ]]; then - echo 'download FullNode.jar success' - fi - - if [[ $sh_file == 0 ]]; then - chmod u+rwx start.sh - echo 'download start.sh success' - fi - - if [[ $config_file == 0 ]]; then - echo 'download config success' - fi - else - echo 'no exists wget, make sure the system can use the "wget" command' - fi -} - -cloneCode() { - if type git >/dev/null 2>&1; then - git_clone=$(git clone -b master git@github.com:tronprotocol/java-tron.git) - if [[ git_clone == 0 ]]; then - echo 'git clone java-tron success' - fi - else - echo 'no exists git, make sure the system can use the "git" command' - fi -} - -cloneBuild() { - clone=`cloneCode` - if [[ $clone == 0 ]]; then - cd 'java-tron' - echo "build java-tron" - sh gradlew clean build -x test - fi -} - -if [[ $START_OPT == '-download' ]]; then - download - sh start.sh -elif [[ $START_OPT == '-clone' ]]; then - cloneCode -elif [[ $START_OPT == '-cb' ]]; then - cloneBuild -else - download -fi \ No newline at end of file From 3ca2f340bf5428a648a8a61f292c856db3f2b4ec Mon Sep 17 00:00:00 2001 From: liukai Date: Mon, 6 Sep 2021 16:15:58 +0800 Subject: [PATCH 207/341] add shell options: 1. add stop option 2. add quick option --- README.md | 2 +- quickstart.md | 135 ---------------------------- start.sh | 239 +++++++++++++++++++++++++++++++++----------------- 3 files changed, 160 insertions(+), 216 deletions(-) diff --git a/README.md b/README.md index 1dff63db4d4..61d4c72dd25 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ This guide walks the user through the TRON Quickstart (v2.0.0) image setup. # Deploy * [Build](./build.md) Please build java-tron after cloning the project * [Run](./run.md) Run java-tron - +* [Run & Build by shell script](./start.md) # Deployment [Deployment Guide](https://tronprotocol.github.io/documentation-en/developers/deployment/) walks the user through how to deploy a FullNode and an SR node. diff --git a/quickstart.md b/quickstart.md index 4e323e7de7b..5359af00060 100644 --- a/quickstart.md +++ b/quickstart.md @@ -239,138 +239,3 @@ docker container kill 513078dc7816 // use your container ID ........ etc ``` - - - -## Set the maximum memory usage of `FullNode.jar` -### Usage - -Get the latest code from github - -``` -sh quickstart.sh -clone -``` - - Clone the latest code from the master branch of https://github.com/tronprotocol/java-tron - -``` -sh quickstart.sh -cb -``` - - Get the latest code from master branch of https://github.com/tronprotocol/java-tron and compileDownload the Latest Release - -``` -sh quickstart.sh -download -``` - -### Download the latest version of the java-tron release -After successful execution, the following files will be automatically downloaded, `start.sh` can be used to start the `FullNode.jar` service - -``` -FullNode-| - \--config.conf - \--FullNode.jar - \--start.sh -``` - -### Start the FullNode.jar via `start.sh` - -Use `-mem` parameter to set the maximum memory usage of `FullNode.jar` - -``` -sh start.sh -mem 12000 -``` - -Physical memory size in MB, here 12000 means 12000MB Start the service with `quickstart.sh` - - - -### Options - -#### quickstart.sh options - -* `-clone` -Clone the latest code for the master branch from`https://github.com/tronprotocol/java-tron` - -* `-download` - - Get the latest version of java-tron distribution quickly - -#### start.sh options -* `-mem` - - Physical memory size in MB - - - -### quickstart.sh - -```shell -#!/bin/bash -START_OPT=$1 -FULL_NODE_DIR="FullNode" -FULL_NODE_VERSION="GreatVoyage-v4.3.0" - -download() { - if [ ! -d "$FULL_NODE_DIR" ]; then - mkdir $FULL_NODE_DIR - cd $FULL_NODE_DIR - elif [ -d "$FULL_NODE_DIR" ]; then - cd $FULL_NODE_DIR - fi - - if type wget >/dev/null 2>&1; then - config_file=$(wget https://raw.githubusercontent.com/tronprotocol/java-tron/develop/framework/src/main/resources/config.conf) - sh_file=$(wget https://raw.githubusercontent.com/tronprotocol/java-tron/develop/start.sh) - full_node=$(wget https://github.com/tronprotocol/java-tron/releases/download/$FULL_NODE_VERSION/FullNode.jar) - - if [[ $full_node == 0 ]]; then - echo 'download FullNode.jar success' - fi - - if [[ $sh_file == 0 ]]; then - chmod u+rwx start.sh - echo 'download start.sh success' - fi - - if [[ $config_file == 0 ]]; then - echo 'download config success' - fi - else - echo 'no exists wget, make sure the system can use the "wget" command' - fi -} - -cloneCode() { - if type git >/dev/null 2>&1; then - git_clone=$(git clone -b master git@github.com:tronprotocol/java-tron.git) - if [[ git_clone == 0 ]]; then - echo 'git clone java-tron success' - fi - else - echo 'no exists git, make sure the system can use the "git" command' - fi -} - -cloneBuild() { - clone=`cloneCode` - if [[ $clone == 0 ]]; then - cd 'java-tron' - echo "build java-tron" - sh gradlew clean build -x test - fi -} - -if [[ $START_OPT == '-download' ]]; then - download - sh start.sh -elif [[ $START_OPT == '-clone' ]]; then - cloneCode -elif [[ $START_OPT == '-cb' ]]; then - cloneBuild -else - download -fi -``` - - diff --git a/start.sh b/start.sh index 6c4d16dd500..1fb03c20e66 100644 --- a/start.sh +++ b/start.sh @@ -4,12 +4,17 @@ FULL_NODE_DIR="FullNode" FULL_NODE_CONFIG="main_net_config.conf" FULL_NODE_SHELL="start.sh" JAR_NAME="FullNode.jar" -FULL_START_OPT=$(echo ${@:2}) +FULL_START_OPT=$(echo ${@:1}) # start service option MAX_STOP_TIME=60 # modify this option to allow the minimum memory to be started, unit MB -ALLOW_MIN_MEMORY=8000 +ALLOW_MIN_MEMORY=8192 +# JVM option +MAX_DIRECT_MEMORY=3g +JVM_MS=4g +JVM_MX=4g + SPECIFY_MEMORY=0 RUN=false UPGRADE=false @@ -20,84 +25,95 @@ REBUILD_DIR="$PWD/output-directory/database" REBUILD_MANIFEST_SIZE=0 REBUILD_BATCH_SIZE=80000 +# download and upgrade +DOWNLOAD=false +RELEASE_URL='https://github.com/tronprotocol/java-tron/releases' +QUICK_START=false + getLatestReleaseVersion() { default_version='GreatVoyage-v4.3.0' full_node_version=`git ls-remote --tags git@github.com:tronprotocol/java-tron.git |grep GreatVoyage- | awk -F '/' 'END{print $3}'` if [[ -n $full_node_version ]]; then - echo "latest release version: $full_node_version" - return $full_node_version + echo $full_node_version else - echo "default version: " $default_version - return $default_version + echo $default_version fi } checkVersion() { - local_full_node_version='' - github_release_version=getLatestReleaseVersion - if [[ $local_full_node_version -ne $github_release_version ]]; then - echo "local version: $local_full_node_version, remote latest version: $github_release_version" - return $github_release_version + github_release_version=$(`echo getLatestReleaseVersion`) + if [[ -n $github_release_version ]]; then + echo "info: github latest version: $github_release_version" + echo $github_release_version else - return $local_full_node_version + echo '' fi } -upgrade(latest_version) { +upgrade() { + latest_version=$(`echo getLatestReleaseVersion`) + echo "info: latest version: $latest_version" if [[ -n $latest_version ]]; then - //备份 - old_jar=$PWD/$JAR_NAME - if [[ -f $old_jar ]];then + old_jar="$PWD/$JAR_NAME" + if [[ -f $old_jar ]]; then + echo "info: backup $old_jar" mv $PWD/$JAR_NAME $PWD/$JAR_NAME'_bak' - if - - is_download=$(wget -q https://github.com/tronprotocol/java-tron/releases/download/$latest_version/$JAR_NAME) - if [[ $is_download == 0 ]]; then - echo "download version $latest_version success" fi + download $RELEASE_URL/download/$latest_version/$JAR_NAME $JAR_NAME + if [[ $? == 0 ]]; then + echo "info: download version $latest_version success" + fi + else + echo 'info: nothing to upgrade' fi } +unsetGitProxy() { + echo 'info: unset git proxy' + git config --global --unset http.proxy +} + download() { + local url=$1 + local file_name=$2 if type wget >/dev/null 2>&1; then - full_node_version=getLatestReleaseVersion - if [ ! -d "$FULL_NODE_DIR" ]; then - echo "mkdir $FULL_NODE_DIR" - mkdir $FULL_NODE_DIR - cd $FULL_NODE_DIR - elif [ -d "$FULL_NODE_DIR" ]; then - cd $FULL_NODE_DIR - fi - echo 'execute download config' - config_file=$(wget -q https://raw.githubusercontent.com/tronprotocol/tron-deployment/master/$FULL_NODE_CONFIG) - sh_file=$(wget -q https://raw.githubusercontent.com/tronprotocol/java-tron/master/$FULL_NODE_SHELL) - full_node=$(wget -q https://github.com/tronprotocol/java-tron/releases/download/$full_node_version/$JAR_NAME) - - if [[ $full_node == 0 ]]; then - echo "download $JAR_NAME success" - fi - - if [[ $sh_file == 0 ]]; then - chmod u+rwx start.sh - echo "download $FULL_NODE_SHELL success" - fi - - if [[ $config_file == 0 ]]; then - echo "download $FULL_NODE_CONFIG success" - fi + wget --no-check-certificate -q $url + elif type curl >/dev/null 2>&1; then + echo "curl -OLJ $url" + curl -OLJ $url else - echo 'no exists wget, make sure the system can use the "wget" command' + echo 'info: no exists wget or curl, make sure the system can use the "wget" or "curl" command' fi } +quickStart() { + if [ ! -d $FULL_NODE_DIR ]; then + echo "info: mkdir $FULL_NODE_DIR" + mkdir $FULL_NODE_DIR + $(cp $0 $FULL_NODE_DIR) + cd $FULL_NODE_DIR + elif [ -d $FULL_NODE_DIR ]; then + cd $FULL_NODE_DIR + fi + full_node_version=$(`echo getLatestReleaseVersion`) + echo "info: check latest version: $full_node_version" + echo 'info: download config' + download https://raw.githubusercontent.com/tronprotocol/tron-deployment/master/$FULL_NODE_CONFIG $FULL_NODE_CONFIG + mv $FULL_NODE_CONFIG 'config.conf' + + echo "info: download $full_node_version" +# unsetGitProxy + download $RELEASE_URL/download/$full_node_version/$JAR_NAME $JAR_NAME +} + cloneCode() { if type git >/dev/null 2>&1; then git_clone=$(git clone -b master git@github.com:tronprotocol/java-tron.git) if [[ git_clone == 0 ]]; then - echo 'git clone java-tron success' + echo 'info: git clone java-tron success' fi else - echo 'no exists git, make sure the system can use the "git" command' + echo 'info: no exists git, make sure the system can use the "git" command' fi } @@ -123,7 +139,7 @@ stopService() { kill -15 $pid sleep 1 else - echo "java-tron stop" + echo "info: java-tron stop" return fi count=$(($count + 1)) @@ -136,68 +152,105 @@ stopService() { } checkAllowMemory() { - if [[ $SPECIFY_MEMORY -gt 0 ]] && + os=`uname` + totalMemory=`getTotalMemory` + totalMemory=`echo $totalMemory` + total=`expr $totalMemory / 1024` + if [[ $os == 'Darwin' ]]; then + return + fi + + if [[ $total -lt $ALLOW_MIN_MEMORY ]]; then + echo "warn: the memory $total MB cannot be smaller than the minimum memory $ALLOW_MIN_MEMORY MB" + exit + elif [[ $SPECIFY_MEMORY -gt 0 ]] && [[ $SPECIFY_MEMORY -lt $ALLOW_MIN_MEMORY ]]; then echo "warn: the specified memory $SPECIFY_MEMORY MB cannot be smaller than the minimum memory $ALLOW_MIN_MEMORY MB" - echo 'start abort' + echo 'warn: start abort' exit fi } setTCMalloc() { - libtcmalloc="/usr/lib64/libtcmalloc.so" - if [[ -f $libtcmalloc ]]; then - export LD_PRELOAD="$libtcmalloc" - export TCMALLOC_RELEASE_RATE=10 - else - echo 'recommended for linux systems using tcmalloc as the default memory management tool' + os=`uname` + if [[ $os == 'Linux' ]] || [[ $os == 'linux' ]] ; then + lib_tc_malloc="/usr/lib64/libtcmalloc.so" + if [[ -f $lib_tc_malloc ]]; then + export LD_PRELOAD="$lib_tc_malloc" + export TCMALLOC_RELEASE_RATE=10 + else + echo 'info: recommended for linux systems using tcmalloc as the default memory management tool' + fi fi } +getTotalMemory() { + os=`uname` + if [[ $os == 'Linux' ]] || [[ $os == 'linux' ]] ; then + total=$(cat /proc/meminfo | grep MemTotal | awk -F ' ' '{print $2}') + echo $total + return + elif [[ $os == 'Darwin' ]]; then + total=$(sysctl -a | grep mem |grep hw.memsize |awk -F ' ' '{print $2}') + echo `expr $total / 1024` + fi +} + +setJVMMemory() { + totalMemory=`getTotalMemory` + total=`echo $totalMemory` + os=`uname` + if [[ $os == 'Linux' ]] || [[ $os == 'linux' ]] ; then + MAX_DIRECT_MEMORY=$(echo "$total/1024/1024*0.1" | bc | awk -F. '{print $1"g"}') + elif [[ $os == 'Darwin' ]]; then + MAX_DIRECT_MEMORY='1g' + fi + JVM_MX=$(echo "$total/1024/1024*0.6" | bc | awk -F. '{print $1"g"}') + JVM_MS=$JVM_MX +} + startService() { - setTCMalloc echo $(date) >>start.log - total=$(cat /proc/meminfo | grep MemTotal | awk -F ' ' '{print $2}') - xmx=$(echo "$total/1024/1024*0.6" | bc | awk -F. '{print $1"g"}') - directmem=$(echo "$total/1024/1024*0.1" | bc | awk -F. '{print $1"g"}') logtime=$(date +%Y-%m-%d_%H-%M-%S) - nohup java -Xms$xmx -Xmx$xmx -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -Xloggc:./gc.log \ + setTCMalloc + setJVMMemory + nohup java -Xms$JVM_MS -Xmx$JVM_MX -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -Xloggc:./gc.log \ -XX:+PrintGCDateStamps -XX:+CMSParallelRemarkEnabled -XX:ReservedCodeCacheSize=256m -XX:+UseCodeCacheFlushing \ -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m \ - -XX:MaxDirectMemorySize=$directmem -XX:+HeapDumpOnOutOfMemoryError \ + -XX:MaxDirectMemorySize=$MAX_DIRECT_MEMORY -XX:+HeapDumpOnOutOfMemoryError \ -XX:NewRatio=2 -jar \ $JAR_NAME $FULL_START_OPT -c config.conf >>start.log 2>&1 & pid=$(ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}') - echo "start java-tron with pid $pid on $HOSTNAME" + echo "info: start java-tron with pid $pid on $HOSTNAME" } rebuildManifest() { - if [[ "$REBUILD_MANIFEST" = false ]]; then - echo 'disable rebuild manifest!' + if [[ $REBUILD_MANIFEST = false ]]; then + echo 'info: disable rebuild manifest!' return fi if [[ ! -d $REBUILD_DIR ]]; then - echo "$REBUILD_DIR not exists, skip rebuild manifest" + echo "info: database not exists, skip rebuild manifest" return fi ARCHIVE_JAR='ArchiveManifest.jar' if [[ -f $ARCHIVE_JAR ]]; then - echo 'execute rebuild manifest.' + echo 'info: execute rebuild manifest.' java -jar $ARCHIVE_JAR -d $REBUILD_DIR -m $REBUILD_MANIFEST_SIZE -b $REBUILD_BATCH_SIZE else - echo 'download the rebuild manifest plugin from the github' - download=$(wget -q https://github.com/tronprotocol/java-tron/releases/download/GreatVoyage-v4.3.0/$ARCHIVE_JAR) + echo 'info: download the rebuild manifest plugin from the github' + download $RELEASE_URL/download/GreatVoyage-v4.3.0/$ARCHIVE_JAR $ARCHIVE_JAR if [[ $download == 0 ]]; then - echo 'download success, rebuild manifest' + echo 'info: download success, rebuild manifest' java -jar $ARCHIVE_JAR $REBUILD_DIR -m $REBUILD_MANIFEST_SIZE -b $REBUILD_BATCH_SIZE fi fi if [[ $? == 0 ]]; then - echo 'rebuild manifest success' + echo 'info: rebuild manifest success' else - echo 'rebuild manifest fail, log in logs/archive.log' + echo 'info: rebuild manifest fail, log in logs/archive.log' fi } @@ -223,8 +276,12 @@ while [ -n "$1" ]; do shift 2 ;; --download) - download - exit + DOWNLOAD=true + shift 1 + ;; + --quickstart) + QUICK_START=true + shift 1 ;; --clone) cloneCode @@ -254,6 +311,10 @@ while [ -n "$1" ]; do RUN=true shift 1 ;; + --stop) + stopService + exit + ;; *) echo "warn: option $1 does not exist" exit @@ -261,14 +322,32 @@ while [ -n "$1" ]; do esac done -if [[ $UPGRADE = true ]]; then - latest_version=checkVersion - upgrade($latest_version) +if [[ $QUICK_START == true ]]; then + quickStart + if [[ $? == 0 ]] ; then + if [[ $RUN == true ]]; then + cd $FULL_NODE_DIR + FULL_START_OPT='' + restart + fi + fi + exit fi -if [[ $RUN = true ]]; then +if [[ $UPGRADE == true ]]; then + upgrade + exit +fi + +if [[ $RUN == true ]]; then restart exit fi +if [[ $DOWNLOAD == true ]]; then + latest=$(`echo getLatestReleaseVersion`) + download $RELEASE_URL/download/$latest/$JAR_NAME $latest + exit +fi + restart \ No newline at end of file From 757fe5178be22ce65bb71df4ca54625ff5b857a8 Mon Sep 17 00:00:00 2001 From: liukai Date: Mon, 6 Sep 2021 18:27:41 +0800 Subject: [PATCH 208/341] add shell.md --- shell.md | 149 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 shell.md diff --git a/shell.md b/shell.md new file mode 100644 index 00000000000..507441a430a --- /dev/null +++ b/shell.md @@ -0,0 +1,149 @@ +## Quick Start Scripting Tool + +## Introduction + +Using the `start.sh` script, you can quickly and easily build and update projects. + +If you have already downloaded `java-tron`, you can use `start.sh` to run `java-tron`, or if you have not downloaded java-tron code or jar packages, you can use `start.sh` to download, compile, or get the latest release version in the form of a `jar package`. + +*** + +## Usage + +### Options + +#### service Operation + +* `--run` + + start the service + + `--stop` + + stop the service + + `-mem` + + secify the memory of the started service, size in MB + +#### build project + +* `--quickstart` + + start a project quickly + +* `-clone` + clone the latest code for the master branch from`https://github.com/tronprotocol/java-tron` + +* `-download` + + get the latest version of java-tron distribution quickly + +* `--cb` + + clone and build the project + +* `--upgrade` + + update the latest version and backup the local jar package + +#### rebuild manifest + +* `-d` + + specify the `output-directory` db directory + +* `-m` + + specify the minimum required manifest file size ,unit:M,default:0 + +* `-b` + + specify the batch manifest size,default:80000 + +* `--dr` or `--disable-rewrite-manifes` + disable rewrite manifes + +*** + +### How to use + +#### 1.service Operation + +**start service** + +``` +sh start.sh +``` + +or + +``` +sh start.sh --run +``` + +**stop service** + +``` +sh start.sh --stop +``` + +**Limit boot memory size** + +Use `-mem` parameter to set the maximum memory usage of `FullNode.jar` + +``` +sh start.sh -mem 12000 +``` + +Physical memory size in MB, here 12000 means 12000MB Start the service with `start.sh` + +#### 2.build project + +**quick start** + +Download the latest version of java-tron + +``` +sh start.sh --quickstart +``` + +contains the following files: + +``` +FullNode-| + \--config.conf + \--FullNode.jar + \--start.sh +``` + +Get the latest code from github + +``` +sh start.sh -clone +``` + + Clone the latest code from the master branch of https://github.com/tronprotocol/java-tron + +``` +sh start.sh -cb +``` + + Get the latest code from master branch of https://github.com/tronprotocol/java-tron and compileDownload the Latest Release + +``` +sh start.sh -download +``` + +#### 3.rebuild manifest + +This tool provides the ability to reformat the manifest according to the current database. + +``` +sh start.sh -d /tmp/db/database -m 128 -b 64000 +``` + +For more design details, please refer to: [TIP298](https://github.com/tronprotocol/tips/issues/298) | [Leveldb Startup Optimization Plugins](https://github.com/tronprotocol/documentation-en/blob/master/docs/developers/archive-manifest.md) + + + From 0de75de6e957e2a9812d88e5e210774cde02870d Mon Sep 17 00:00:00 2001 From: liukai Date: Mon, 6 Sep 2021 18:29:28 +0800 Subject: [PATCH 209/341] modify README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 61d4c72dd25..27c8c209127 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ This guide walks the user through the TRON Quickstart (v2.0.0) image setup. # Deploy * [Build](./build.md) Please build java-tron after cloning the project * [Run](./run.md) Run java-tron -* [Run & Build by shell script](./start.md) +* [Build & Run by shell script](./shell.md) # Deployment [Deployment Guide](https://tronprotocol.github.io/documentation-en/developers/deployment/) walks the user through how to deploy a FullNode and an SR node. From 8d7d34ee148f593962e74b192c119a5fe3dc8131 Mon Sep 17 00:00:00 2001 From: liukai Date: Mon, 6 Sep 2021 18:30:42 +0800 Subject: [PATCH 210/341] modify shell.md --- shell.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/shell.md b/shell.md index 507441a430a..42e437f2000 100644 --- a/shell.md +++ b/shell.md @@ -18,20 +18,20 @@ If you have already downloaded `java-tron`, you can use `start.sh` to run `java- start the service - `--stop` +* `--stop` stop the service - `-mem` - +* `-mem` + secify the memory of the started service, size in MB #### build project * `--quickstart` - + start a project quickly - + * `-clone` clone the latest code for the master branch from`https://github.com/tronprotocol/java-tron` @@ -47,6 +47,7 @@ If you have already downloaded `java-tron`, you can use `start.sh` to run `java- update the latest version and backup the local jar package + #### rebuild manifest * `-d` @@ -62,7 +63,7 @@ If you have already downloaded `java-tron`, you can use `start.sh` to run `java- specify the batch manifest size,default:80000 * `--dr` or `--disable-rewrite-manifes` - disable rewrite manifes + disable rewrite manifes *** @@ -147,3 +148,4 @@ For more design details, please refer to: [TIP298](https://github.com/tronprotoc + From 6ffee311cd0e83b2234ac157cf06484bd471458f Mon Sep 17 00:00:00 2001 From: sophiawang <1975054324@qq.com> Date: Tue, 7 Sep 2021 17:40:09 +0800 Subject: [PATCH 211/341] fix checkstyle --- .../newGrammar/NewFeatureForSolc086.java | 11 +++++++++++ .../src/test/resources/soliditycode/NewFeature086.sol | 6 ++++++ 2 files changed, 17 insertions(+) diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/NewFeatureForSolc086.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/NewFeatureForSolc086.java index 84929452efa..30544ef8e64 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/NewFeatureForSolc086.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/NewFeatureForSolc086.java @@ -277,6 +277,17 @@ public void test12GetConcatAddress() { Assert.assertEquals(res1, res2); } + @Test(enabled = true, description = "test bytes concat with empty string") + public void test13bytesConcatWithEmptyStr() { + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(mapKeyContract, + "bytesConcatWithEmptyStr()", "#", false, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + Assert.assertEquals(true, transactionExtention.getResult().getResult()); + Assert.assertEquals("SUCESS", + transactionExtention.getTransaction().getRet(0).getRet().toString()); + } + /** * constructor. */ diff --git a/framework/src/test/resources/soliditycode/NewFeature086.sol b/framework/src/test/resources/soliditycode/NewFeature086.sol index fd4f2774438..f898fadde3e 100644 --- a/framework/src/test/resources/soliditycode/NewFeature086.sol +++ b/framework/src/test/resources/soliditycode/NewFeature086.sol @@ -90,6 +90,12 @@ contract C { return a.length; } + bytes p = "hihello"; + function bytesConcatWithEmptyStr() public view { + bytes memory a = bytes.concat("hi", "", "hello"); + assert(p.length == a.length); + } + event ssoo(uint256); function testEmitEvent() public payable { emit ssoo(6); From 06650deb8a56e93e3f5134b9e27bccc0d8bc337f Mon Sep 17 00:00:00 2001 From: sophiawang <1975054324@qq.com> Date: Tue, 7 Sep 2021 17:40:09 +0800 Subject: [PATCH 212/341] add case for contact "" --- .../newGrammar/NewFeatureForSolc086.java | 11 +++++++++++ .../src/test/resources/soliditycode/NewFeature086.sol | 6 ++++++ 2 files changed, 17 insertions(+) diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/NewFeatureForSolc086.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/NewFeatureForSolc086.java index 84929452efa..30544ef8e64 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/NewFeatureForSolc086.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/NewFeatureForSolc086.java @@ -277,6 +277,17 @@ public void test12GetConcatAddress() { Assert.assertEquals(res1, res2); } + @Test(enabled = true, description = "test bytes concat with empty string") + public void test13bytesConcatWithEmptyStr() { + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(mapKeyContract, + "bytesConcatWithEmptyStr()", "#", false, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + Assert.assertEquals(true, transactionExtention.getResult().getResult()); + Assert.assertEquals("SUCESS", + transactionExtention.getTransaction().getRet(0).getRet().toString()); + } + /** * constructor. */ diff --git a/framework/src/test/resources/soliditycode/NewFeature086.sol b/framework/src/test/resources/soliditycode/NewFeature086.sol index fd4f2774438..f898fadde3e 100644 --- a/framework/src/test/resources/soliditycode/NewFeature086.sol +++ b/framework/src/test/resources/soliditycode/NewFeature086.sol @@ -90,6 +90,12 @@ contract C { return a.length; } + bytes p = "hihello"; + function bytesConcatWithEmptyStr() public view { + bytes memory a = bytes.concat("hi", "", "hello"); + assert(p.length == a.length); + } + event ssoo(uint256); function testEmitEvent() public payable { emit ssoo(6); From a62e6b2dfe5173f6d9dda82ec686523cbb80eaa0 Mon Sep 17 00:00:00 2001 From: liukai Date: Tue, 7 Sep 2021 18:39:56 +0800 Subject: [PATCH 213/341] modify shell.md start.sh --- README.md | 5 ++- shell.md | 56 +++++++++++++----------------- start.sh | 102 +++++++++++++++++++++++++++++++++++------------------- 3 files changed, 95 insertions(+), 68 deletions(-) diff --git a/README.md b/README.md index 27c8c209127..8b36b529880 100644 --- a/README.md +++ b/README.md @@ -96,4 +96,7 @@ If you'd like to contribute to java-tron, please read the following instructions * [White Paper](https://tron.network/resources?lng=&name=1) White paper of TRON network. # License -java-tron is released under the [LGPLv3 license](https://github.com/tronprotocol/java-tron/blob/master/LICENSE). \ No newline at end of file +java-tron is released under the [LGPLv3 license](https://github.com/tronprotocol/java-tron/blob/master/LICENSE). + + +脚本贴到这里 \ No newline at end of file diff --git a/shell.md b/shell.md index 42e437f2000..f1b26e3ec3b 100644 --- a/shell.md +++ b/shell.md @@ -2,7 +2,7 @@ ## Introduction -Using the `start.sh` script, you can quickly and easily build and update projects. +Using the `start.sh` script, you can quickly and easily build projects. If you have already downloaded `java-tron`, you can use `start.sh` to run `java-tron`, or if you have not downloaded java-tron code or jar packages, you can use `start.sh` to download, compile, or get the latest release version in the form of a `jar package`. @@ -22,30 +22,31 @@ If you have already downloaded `java-tron`, you can use `start.sh` to run `java- stop the service -* `-mem` - - secify the memory of the started service, size in MB +* `-c` -#### build project + configuration file path,default loading of `config.conf` + +* `-d` -* `--quickstart` - - start a project quickly - -* `-clone` - clone the latest code for the master branch from`https://github.com/tronprotocol/java-tron` + database output directory, default path `output-directory` -* `-download` +* `-j` - get the latest version of java-tron distribution quickly + jar package path,default package name `FullNode.jar ` -* `--cb` +* `-mem` + + specifies the memory of the started service, size in`MB`,jvm's startup maximum memory will be adjusted according to this parameter + +#### build project - clone and build the project +* `-cb` -* `--upgrade` + start.sh can be used independently, get the latest code, and compile - update the latest version and backup the local jar package +* `--release` + + get the latest version of the `jar` package from github #### rebuild manifest @@ -62,8 +63,8 @@ If you have already downloaded `java-tron`, you can use `start.sh` to run `java- specify the batch manifest size,default:80000 -* `--dr` or `--disable-rewrite-manifes` - disable rewrite manifes +* `-dr` or `--disable-rewrite-manifes` + disable rewrite manifes *** @@ -101,12 +102,12 @@ Physical memory size in MB, here 12000 means 12000MB Start the service with `sta #### 2.build project -**quick start** +**release** Download the latest version of java-tron ``` -sh start.sh --quickstart +sh start.sh --release ``` contains the following files: @@ -118,23 +119,15 @@ FullNode-| \--start.sh ``` -Get the latest code from github - -``` -sh start.sh -clone -``` +**clone and build** - Clone the latest code from the master branch of https://github.com/tronprotocol/java-tron +Get the latest code from master branch of https://github.com/tronprotocol/java-tron and compile download the latest release ``` sh start.sh -cb ``` - Get the latest code from master branch of https://github.com/tronprotocol/java-tron and compileDownload the Latest Release -``` -sh start.sh -download -``` #### 3.rebuild manifest @@ -148,4 +141,3 @@ For more design details, please refer to: [TIP298](https://github.com/tronprotoc - diff --git a/start.sh b/start.sh index 1fb03c20e66..202e3604741 100644 --- a/start.sh +++ b/start.sh @@ -2,16 +2,18 @@ # build FullNode config FULL_NODE_DIR="FullNode" FULL_NODE_CONFIG="main_net_config.conf" +DEFAULT_FULL_NODE_CONFIG='config.conf' FULL_NODE_SHELL="start.sh" JAR_NAME="FullNode.jar" -FULL_START_OPT=$(echo ${@:1}) +FULL_START_OPT='' +GITHUB_BRANCH='master' # start service option MAX_STOP_TIME=60 # modify this option to allow the minimum memory to be started, unit MB ALLOW_MIN_MEMORY=8192 # JVM option -MAX_DIRECT_MEMORY=3g +MAX_DIRECT_MEMORY=1g JVM_MS=4g JVM_MX=4g @@ -68,11 +70,6 @@ upgrade() { fi } -unsetGitProxy() { - echo 'info: unset git proxy' - git config --global --unset http.proxy -} - download() { local url=$1 local file_name=$2 @@ -98,17 +95,16 @@ quickStart() { full_node_version=$(`echo getLatestReleaseVersion`) echo "info: check latest version: $full_node_version" echo 'info: download config' - download https://raw.githubusercontent.com/tronprotocol/tron-deployment/master/$FULL_NODE_CONFIG $FULL_NODE_CONFIG + download https://raw.githubusercontent.com/tronprotocol/tron-deployment/$GITHUB_BRANCH/$FULL_NODE_CONFIG $FULL_NODE_CONFIG mv $FULL_NODE_CONFIG 'config.conf' echo "info: download $full_node_version" -# unsetGitProxy download $RELEASE_URL/download/$full_node_version/$JAR_NAME $JAR_NAME } cloneCode() { if type git >/dev/null 2>&1; then - git_clone=$(git clone -b master git@github.com:tronprotocol/java-tron.git) + git_clone=$(git clone -b $GITHUB_BRANCH git@github.com:tronprotocol/java-tron.git) if [[ git_clone == 0 ]]; then echo 'info: git clone java-tron success' fi @@ -118,16 +114,17 @@ cloneCode() { } cloneBuild() { - clone=$(cloneCode) - if [[ $clone == 0 ]]; then - cd 'java-tron' - echo "build java-tron" - sh gradlew clean build -x test - fi + cloneCode + cd 'java-tron' + echo "info: build java-tron" + sh gradlew clean build -x test } checkPid() { - pid=$(ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}') + if [[ $JAR_NAME =~ '/' ]]; then + JAR_NAME=$(echo $JAR_NAME |awk -F '/' '{print $NF}') + fi + pid=$(ps -ef | grep -v start | grep $JAR_NAME | grep -v grep | awk '{print $2}') return $pid } @@ -153,8 +150,8 @@ stopService() { checkAllowMemory() { os=`uname` - totalMemory=`getTotalMemory` - totalMemory=`echo $totalMemory` +# totalMemory=`getTotalMemory` + totalMemory=$(`echo getTotalMemory`) total=`expr $totalMemory / 1024` if [[ $os == 'Darwin' ]]; then return @@ -197,31 +194,46 @@ getTotalMemory() { } setJVMMemory() { - totalMemory=`getTotalMemory` - total=`echo $totalMemory` os=`uname` if [[ $os == 'Linux' ]] || [[ $os == 'linux' ]] ; then - MAX_DIRECT_MEMORY=$(echo "$total/1024/1024*0.1" | bc | awk -F. '{print $1"g"}') + if [[ $SPECIFY_MEMORY >0 ]]; then + max_direct=$(echo "$SPECIFY_MEMORY/1024*0.1" | bc | awk -F. '{print $1"g"}') + echo "max_direct$max_direct" + if [[ "$max_direct" != "g" ]]; then + MAX_DIRECT_MEMORY=$max_direct + fi + + JVM_MX=$(echo "$SPECIFY_MEMORY/1024*0.6" | bc | awk -F. '{print $1"g"}') + JVM_MS=$JVM_MX + else + total=$(`echo getTotalMemory`) + MAX_DIRECT_MEMORY=$(echo "$total/1024/1024*0.1" | bc | awk -F. '{print $1"g"}') + JVM_MX=$(echo "$total/1024/1024*0.6" | bc | awk -F. '{print $1"g"}') + JVM_MS=$JVM_MX + fi + elif [[ $os == 'Darwin' ]]; then MAX_DIRECT_MEMORY='1g' fi - JVM_MX=$(echo "$total/1024/1024*0.6" | bc | awk -F. '{print $1"g"}') - JVM_MS=$JVM_MX } startService() { echo $(date) >>start.log logtime=$(date +%Y-%m-%d_%H-%M-%S) - setTCMalloc - setJVMMemory + + if [[ ! $JAR_NAME =~ '-c' ]]; then + FULL_START_OPT="$FULL_START_OPT -c $DEFAULT_FULL_NODE_CONFIG" + fi + nohup java -Xms$JVM_MS -Xmx$JVM_MX -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -Xloggc:./gc.log \ -XX:+PrintGCDateStamps -XX:+CMSParallelRemarkEnabled -XX:ReservedCodeCacheSize=256m -XX:+UseCodeCacheFlushing \ -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m \ -XX:MaxDirectMemorySize=$MAX_DIRECT_MEMORY -XX:+HeapDumpOnOutOfMemoryError \ -XX:NewRatio=2 -jar \ - $JAR_NAME $FULL_START_OPT -c config.conf >>start.log 2>&1 & - pid=$(ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}') + $JAR_NAME $FULL_START_OPT >>start.log 2>&1 & + checkPid echo "info: start java-tron with pid $pid on $HOSTNAME" + echo "info: stop service execution: sh start.sh --stop" } rebuildManifest() { @@ -258,28 +270,52 @@ restart() { stopService checkAllowMemory rebuildManifest + setTCMalloc + setJVMMemory startService } while [ -n "$1" ]; do case "$1" in + -c) + DEFAULT_FULL_NODE_CONFIG=$2 + FULL_START_OPT="$FULL_START_OPT $1 $2" + shift 2 + ;; -d) REBUILD_DIR=$2/database + FULL_START_OPT="$FULL_START_OPT $1 $2" + shift 2 + ;; + -j) + JAR_NAME=$2 shift 2 ;; -m) REBUILD_MANIFEST_SIZE=$2 shift 2 ;; + -n) + JAR_NAME=$2 + shift 2 + ;; -b) REBUILD_BATCH_SIZE=$2 shift 2 ;; + -cb) + cloneBuild + exit + ;; --download) DOWNLOAD=true shift 1 ;; - --quickstart) + --deploy) + QUICK_START=true + shift 1 + ;; + --release) QUICK_START=true shift 1 ;; @@ -287,11 +323,7 @@ while [ -n "$1" ]; do cloneCode exit ;; - --cb) - cloneBuild - exit - ;; - --mem) + -mem) SPECIFY_MEMORY=$2 shift 2 ;; @@ -299,7 +331,7 @@ while [ -n "$1" ]; do REBUILD_MANIFEST=false shift 1 ;; - --dr) + -dr) REBUILD_MANIFEST=false shift 1 ;; From 0b9e37e6671eecc09d98d425731c3107168b8681 Mon Sep 17 00:00:00 2001 From: liukai Date: Tue, 7 Sep 2021 19:00:59 +0800 Subject: [PATCH 214/341] add release and cb run --- shell.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/shell.md b/shell.md index f1b26e3ec3b..4de2620666f 100644 --- a/shell.md +++ b/shell.md @@ -70,7 +70,7 @@ If you have already downloaded `java-tron`, you can use `start.sh` to run `java- ### How to use -#### 1.service Operation +#### 1.local mode **start service** @@ -100,14 +100,14 @@ sh start.sh -mem 12000 Physical memory size in MB, here 12000 means 12000MB Start the service with `start.sh` -#### 2.build project +#### 2.online mode **release** Download the latest version of java-tron ``` -sh start.sh --release +sh start.sh --release --run ``` contains the following files: @@ -124,7 +124,7 @@ FullNode-| Get the latest code from master branch of https://github.com/tronprotocol/java-tron and compile download the latest release ``` -sh start.sh -cb +sh start.sh -cb --run ``` From b13a7ca291b690d09bfe5485f0fea594568234d2 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Tue, 7 Sep 2021 19:06:34 +0800 Subject: [PATCH 215/341] feat: add baseFeePerGas and mixHash to BlockResult --- .../core/services/jsonrpc/TronJsonRpc.java | 26 ++----------------- 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 0007181f921..a76122e1638 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -50,30 +50,8 @@ class BlockResult { public Object[] transactions; //TransactionResult or byte32 public String[] uncles; - @Override - public String toString() { - return "BlockResult{" - + "number='" + number + '\'' - + ", hash='" + hash + '\'' - + ", parentHash='" + parentHash + '\'' - + ", nonce='" + nonce + '\'' - + ", sha3Uncles='" + sha3Uncles + '\'' - + ", logsBloom='" + logsBloom + '\'' - + ", transactionsRoot='" + transactionsRoot + '\'' - + ", stateRoot='" + stateRoot + '\'' - + ", receiptsRoot='" + receiptsRoot + '\'' - + ", miner='" + miner + '\'' - + ", difficulty='" + difficulty + '\'' - + ", totalDifficulty='" + totalDifficulty + '\'' - + ", extraData='" + extraData + '\'' - + ", size='" + size + '\'' - + ", gas='" + gasLimit + '\'' - + ", gasUsed='" + gasUsed + '\'' - + ", timestamp='" + timestamp + '\'' - + ", transactions=" + Arrays.toString(transactions) - + ", uncles=" + Arrays.toString(uncles) - + '}'; - } + public String baseFeePerGas = null; + public String mixHash = null; } class CompilationResult { From 1591cc34aa255d1d4ce37eb5a5f00c90ddcd133d Mon Sep 17 00:00:00 2001 From: sophiawang <1975054324@qq.com> Date: Wed, 8 Sep 2021 11:13:31 +0800 Subject: [PATCH 216/341] adapt case to java-tron v4.4.0 --- .../trctoken/ContractTrcToken005.java | 43 ++++++++++--------- .../triggerconstant/TriggerConstant003.java | 8 +--- 2 files changed, 24 insertions(+), 27 deletions(-) diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/trctoken/ContractTrcToken005.java b/framework/src/test/java/stest/tron/wallet/dailybuild/trctoken/ContractTrcToken005.java index f318aa23189..8c60e5b0ff2 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/trctoken/ContractTrcToken005.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/trctoken/ContractTrcToken005.java @@ -230,8 +230,8 @@ public void deployTransferTokenContract() { Assert.assertFalse(response.getResult()); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, response.getCode()); - Assert.assertEquals("contract validate error : Owner no asset!", - response.getMessage().toStringUtf8()); + Assert.assertEquals("contract validate error : Owner no asset!".toLowerCase(), + response.getMessage().toStringUtf8().toLowerCase()); // tokenId is Long.MAX_VALUE tokenId = Long.toString(Long.MAX_VALUE); @@ -245,7 +245,8 @@ public void deployTransferTokenContract() { Assert.assertFalse(response.getResult()); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, response.getCode()); Assert - .assertEquals("contract validate error : No asset !", response.getMessage().toStringUtf8()); + .assertEquals("contract validate error : No asset !".toLowerCase(), + response.getMessage().toStringUtf8().toLowerCase()); Assert.assertTrue(PublicMethed .transferAsset(user001Address, assetAccountId.toByteArray(), 10L, dev001Address, dev001Key, @@ -263,8 +264,8 @@ public void deployTransferTokenContract() { Assert.assertFalse(response.getResult()); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, response.getCode()); - Assert.assertEquals("contract validate error : assetBalance is not sufficient.", - response.getMessage().toStringUtf8()); + Assert.assertEquals("contract validate error : assetBalance is not sufficient.".toLowerCase(), + response.getMessage().toStringUtf8().toLowerCase()); // tokenvalue is less than 0 tokenId = assetAccountId.toStringUtf8(); @@ -277,8 +278,8 @@ public void deployTransferTokenContract() { Assert.assertFalse(response.getResult()); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, response.getCode()); - Assert.assertEquals("contract validate error : tokenValue must be >= 0", - response.getMessage().toStringUtf8()); + Assert.assertEquals("contract validate error : tokenValue must be >= 0".toLowerCase(), + response.getMessage().toStringUtf8().toLowerCase()); tokenId = assetAccountId.toStringUtf8(); tokenValue = Long.MIN_VALUE; @@ -290,8 +291,8 @@ public void deployTransferTokenContract() { Assert.assertFalse(response.getResult()); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, response.getCode()); - Assert.assertEquals("contract validate error : tokenValue must be >= 0", - response.getMessage().toStringUtf8()); + Assert.assertEquals("contract validate error : tokenValue must be >= 0".toLowerCase(), + response.getMessage().toStringUtf8().toLowerCase()); /*PublicMethed .sendcoin(transferTokenContractAddress, 5000000, fromAddress, testKey002, blockingStubFull); @@ -308,8 +309,8 @@ public void deployTransferTokenContract() { Assert.assertFalse(response.getResult()); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, response.getCode()); - Assert.assertEquals("contract validate error : tokenId must be > 1000000", - response.getMessage().toStringUtf8()); + Assert.assertEquals("contract validate error : tokenId must be > 1000000".toLowerCase(), + response.getMessage().toStringUtf8().toLowerCase()); // tokenId is long.min tokenId = Long.toString(Long.MIN_VALUE); @@ -322,8 +323,8 @@ public void deployTransferTokenContract() { Assert.assertFalse(response.getResult()); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, response.getCode()); - Assert.assertEquals("contract validate error : tokenId must be > 1000000", - response.getMessage().toStringUtf8()); + Assert.assertEquals("contract validate error : tokenId must be > 1000000".toLowerCase(), + response.getMessage().toStringUtf8().toLowerCase()); // tokenId is 0 tokenId = Long.toString(0); @@ -337,8 +338,8 @@ public void deployTransferTokenContract() { Assert.assertFalse(response.getResult()); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, response.getCode()); Assert.assertEquals( - "contract validate error : invalid arguments with tokenValue = 10, tokenId = 0", - response.getMessage().toStringUtf8()); + "contract validate error : invalid arguments with tokenValue = 10, tokenId = 0" + .toLowerCase(), response.getMessage().toStringUtf8().toLowerCase()); /*PublicMethed .sendcoin(transferTokenContractAddress, 5000000, fromAddress, testKey002, blockingStubFull); @@ -354,8 +355,8 @@ public void deployTransferTokenContract() { Assert.assertFalse(response.getResult()); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, response.getCode()); - Assert.assertEquals("contract validate error : tokenId must be > 1000000", - response.getMessage().toStringUtf8()); + Assert.assertEquals("contract validate error : tokenId must be > 1000000".toLowerCase(), + response.getMessage().toStringUtf8().toLowerCase()); tokenId = Long.toString(-1); @@ -368,8 +369,8 @@ public void deployTransferTokenContract() { Assert.assertFalse(response.getResult()); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, response.getCode()); - Assert.assertEquals("contract validate error : tokenId must be > 1000000", - response.getMessage().toStringUtf8()); + Assert.assertEquals("contract validate error : tokenId must be > 1000000".toLowerCase(), + response.getMessage().toStringUtf8().toLowerCase()); tokenId = Long.toString(100_0000L); @@ -382,8 +383,8 @@ public void deployTransferTokenContract() { Assert.assertFalse(response.getResult()); Assert.assertEquals(CONTRACT_VALIDATE_ERROR, response.getCode()); - Assert.assertEquals("contract validate error : tokenId must be > 1000000", - response.getMessage().toStringUtf8()); + Assert.assertEquals("contract validate error : tokenId must be > 1000000".toLowerCase(), + response.getMessage().toStringUtf8().toLowerCase()); accountResource = PublicMethed.getAccountResource(dev001Address, blockingStubFull); long devEnergyLimitAfter = accountResource.getEnergyLimit(); diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/triggerconstant/TriggerConstant003.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/triggerconstant/TriggerConstant003.java index b542e36e10b..c28e838eed1 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/triggerconstant/TriggerConstant003.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/triggerconstant/TriggerConstant003.java @@ -209,7 +209,7 @@ public void test003TriggerConstantContract() { "testPayable()", "#", false, 1L, 1000000000, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); transaction = transactionExtention.getTransaction(); - + System.out.println(transactionExtention.toString()); result = transactionExtention.getConstantResult(0).toByteArray(); System.out.println("message:" + transaction.getRet(0).getRet()); System.out.println(":" + ByteArray @@ -219,11 +219,7 @@ public void test003TriggerConstantContract() { Assert.assertEquals(1, ByteArray.toLong(ByteArray .fromHexString(Hex .toHexString(result)))); - Assert.assertEquals("constant cannot set call value or call token value.", - ByteArray - .toStr(transactionExtention.getResult().getMessage().toByteArray())); - Assert.assertEquals("FAILED", transaction.getRet(0).getRet().toString()); - + Assert.assertEquals("SUCESS", transaction.getRet(0).getRet().toString()); } From 3bdbc809755a13fa51e065596f2f60443bbe6011 Mon Sep 17 00:00:00 2001 From: liukai Date: Wed, 8 Sep 2021 11:58:55 +0800 Subject: [PATCH 217/341] add option usage --- shell.md | 114 +++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 95 insertions(+), 19 deletions(-) diff --git a/shell.md b/shell.md index 4de2620666f..6a03dce0b2b 100644 --- a/shell.md +++ b/shell.md @@ -24,15 +24,15 @@ If you have already downloaded `java-tron`, you can use `start.sh` to run `java- * `-c` - configuration file path,default loading of `config.conf` + load the specified path configuration file, default load the `config.conf` at the same level as `FullNode.jar` * `-d` - database output directory, default path `output-directory` + specify the database storage path, The default is in the current directory where `FullNode.jar` is located * `-j` - jar package path,default package name `FullNode.jar ` + specify the directory where the program is located, default package name `FullNode.jar ` * `-mem` @@ -70,8 +70,21 @@ If you have already downloaded `java-tron`, you can use `start.sh` to run `java- ### How to use +* Local mode +* Online mode + #### 1.local mode +Format: + +``` +sh start.sh [option] +``` + +``` +sh start.sh [-j ] [-d ] [-c ] [[--run] | [--stop]] +``` + **start service** ``` @@ -80,6 +93,8 @@ sh start.sh or + + ``` sh start.sh --run ``` @@ -90,54 +105,115 @@ sh start.sh --run sh start.sh --stop ``` -**Limit boot memory size** -Use `-mem` parameter to set the maximum memory usage of `FullNode.jar` + +#### 2.online mode + +**Get the latest release** + +Format: ``` -sh start.sh -mem 12000 +sh start.sh --release [option] ``` -Physical memory size in MB, here 12000 means 12000MB Start the service with `start.sh` +Download the latest version of java-tron, demo: -#### 2.online mode +``` +sh start.sh --release +``` -**release** +contains the following files: -Download the latest version of java-tron +``` +├── ... +├── FullNode/ + ├── config.conf + ├── FullNode.jar + ├── start.sh +``` + +Get the latest version up and running, demo: ``` sh start.sh --release --run ``` +**clone code and build** + +Get the latest code from master branch of https://github.com/tronprotocol/java-tron and compile download the latest release. + +Format: + +``` +sh start.sh -cb [option] +``` + +demo: + +``` +sh start.sh -cb +``` + contains the following files: ``` -FullNode-| - \--config.conf - \--FullNode.jar - \--start.sh +├── ... +├── java-tron/ + ├── actuator/ + ├── chainbase/ + ├── common/ + ├── config/ + ├── consensus/ + ├── crypto/ + ├── docker/ + ├── docs/ + ├── example/ + ├── framework/ + ├── gradle/ + ├── plugins/ + ├── protocol/ + ├── config.conf + ├── FullNode.jar + ├── start.sh + ├── README.md + ├── ... ``` -**clone and build** +Download the code and compile and run it -Get the latest code from master branch of https://github.com/tronprotocol/java-tron and compile download the latest release +demo: ``` sh start.sh -cb --run ``` +After using this command, the FullNode directory will be created and the compiled file FullNode.jar and related configuration files will be copied to this directory + +``` +├── ... +├── FullNode/ + ├── config.conf + ├── FullNode.jar + ├── start.sh +``` + #### 3.rebuild manifest This tool provides the ability to reformat the manifest according to the current database. +Format: + ``` -sh start.sh -d /tmp/db/database -m 128 -b 64000 +sh start.sh [-m ] | [-b ] | [-d ] ``` -For more design details, please refer to: [TIP298](https://github.com/tronprotocol/tips/issues/298) | [Leveldb Startup Optimization Plugins](https://github.com/tronprotocol/documentation-en/blob/master/docs/developers/archive-manifest.md) - +Demo +``` +sh start.sh -d /tmp/db/database -m 128 -b 64000 +``` +For more design details, please refer to: [TIP298](https://github.com/tronprotocol/tips/issues/298) | [Leveldb Startup Optimization Plugins](https://github.com/tronprotocol/documentation-en/blob/master/docs/developers/archive-manifest.md) From 902b2910261454358d637fb6b1e5c82b8dea7127 Mon Sep 17 00:00:00 2001 From: liukai Date: Wed, 8 Sep 2021 12:00:13 +0800 Subject: [PATCH 218/341] add option usage --- start.sh | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/start.sh b/start.sh index 202e3604741..b9697b750a9 100644 --- a/start.sh +++ b/start.sh @@ -83,7 +83,7 @@ download() { fi } -quickStart() { +mkdirFullNode() { if [ ! -d $FULL_NODE_DIR ]; then echo "info: mkdir $FULL_NODE_DIR" mkdir $FULL_NODE_DIR @@ -92,6 +92,11 @@ quickStart() { elif [ -d $FULL_NODE_DIR ]; then cd $FULL_NODE_DIR fi + +} + +quickStart() { + mkdirFullNode full_node_version=$(`echo getLatestReleaseVersion`) echo "info: check latest version: $full_node_version" echo 'info: download config' @@ -115,9 +120,12 @@ cloneCode() { cloneBuild() { cloneCode - cd 'java-tron' echo "info: build java-tron" - sh gradlew clean build -x test + sh 'java-tron/'gradlew clean build -x test + mkdirFullNode + if [[ $? == 0 ]];then + cp 'java-tron/build/libs/FullNode.jar' 'FullNode/' + fi } checkPid() { @@ -198,11 +206,9 @@ setJVMMemory() { if [[ $os == 'Linux' ]] || [[ $os == 'linux' ]] ; then if [[ $SPECIFY_MEMORY >0 ]]; then max_direct=$(echo "$SPECIFY_MEMORY/1024*0.1" | bc | awk -F. '{print $1"g"}') - echo "max_direct$max_direct" if [[ "$max_direct" != "g" ]]; then MAX_DIRECT_MEMORY=$max_direct fi - JVM_MX=$(echo "$SPECIFY_MEMORY/1024*0.6" | bc | awk -F. '{print $1"g"}') JVM_MS=$JVM_MX else @@ -275,6 +281,13 @@ restart() { startService } +//加校验 + +//3个例子 +1.本地起 +2.拉代码 +3.拉release + 加验验 while [ -n "$1" ]; do case "$1" in -c) @@ -305,7 +318,7 @@ while [ -n "$1" ]; do ;; -cb) cloneBuild - exit + shift 1 ;; --download) DOWNLOAD=true From 86d0391f89e324f97bd7210e88b8b96ba3a58211 Mon Sep 17 00:00:00 2001 From: liukai Date: Wed, 8 Sep 2021 12:01:40 +0800 Subject: [PATCH 219/341] add option usage --- shell.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/shell.md b/shell.md index 6a03dce0b2b..93d30e1183b 100644 --- a/shell.md +++ b/shell.md @@ -174,8 +174,8 @@ contains the following files: ├── plugins/ ├── protocol/ ├── config.conf - ├── FullNode.jar - ├── start.sh + ├── FullNode.jar + ├── start.sh ├── README.md ├── ... ``` @@ -217,3 +217,7 @@ sh start.sh -d /tmp/db/database -m 128 -b 64000 ``` For more design details, please refer to: [TIP298](https://github.com/tronprotocol/tips/issues/298) | [Leveldb Startup Optimization Plugins](https://github.com/tronprotocol/documentation-en/blob/master/docs/developers/archive-manifest.md) + + + + From b62d6617c9fae3dffe375f73150affb6f4d2be4c Mon Sep 17 00:00:00 2001 From: liukai Date: Wed, 8 Sep 2021 12:02:34 +0800 Subject: [PATCH 220/341] add option usage --- shell.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shell.md b/shell.md index 93d30e1183b..2c8e190cc51 100644 --- a/shell.md +++ b/shell.md @@ -129,8 +129,8 @@ contains the following files: ├── ... ├── FullNode/ ├── config.conf - ├── FullNode.jar - ├── start.sh + ├── FullNode.jar + ├── start.sh ``` Get the latest version up and running, demo: From e9e9d648921216cabc154f13f92c8cdac98ae0e3 Mon Sep 17 00:00:00 2001 From: liukai Date: Wed, 8 Sep 2021 12:03:26 +0800 Subject: [PATCH 221/341] modify: format --- shell.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/shell.md b/shell.md index 2c8e190cc51..cc32c94e89b 100644 --- a/shell.md +++ b/shell.md @@ -93,8 +93,6 @@ sh start.sh or - - ``` sh start.sh --run ``` From 62ee1dbc6bfd571e249ae6934cf4bf2dfe16db37 Mon Sep 17 00:00:00 2001 From: sophiawang <1975054324@qq.com> Date: Wed, 8 Sep 2021 14:34:46 +0800 Subject: [PATCH 222/341] add case to java-tron v4.4.0 --- .../newGrammar/NewFeatureForJavatron440.java | 283 ++++++++++++++++++ .../soliditycode/NewFeatureJavatron440.sol | 58 ++++ 2 files changed, 341 insertions(+) create mode 100644 framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/NewFeatureForJavatron440.java create mode 100644 framework/src/test/resources/soliditycode/NewFeatureJavatron440.sol diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/NewFeatureForJavatron440.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/NewFeatureForJavatron440.java new file mode 100644 index 00000000000..773e13fa888 --- /dev/null +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/NewFeatureForJavatron440.java @@ -0,0 +1,283 @@ +package stest.tron.wallet.dailybuild.tvmnewcommand.newGrammar; + +import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; +import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Test; +import org.tron.api.GrpcAPI; +import org.tron.api.WalletGrpc; +import org.tron.common.crypto.ECKey; +import org.tron.common.utils.ByteArray; +import org.tron.common.utils.Utils; +import org.tron.core.Wallet; +import org.tron.protos.Protocol; +import org.tron.protos.contract.SmartContractOuterClass; +import stest.tron.wallet.common.client.Configuration; +import stest.tron.wallet.common.client.Parameter; +import stest.tron.wallet.common.client.utils.Base58; +import stest.tron.wallet.common.client.utils.PublicMethed; + +import java.util.HashMap; +import java.util.Optional; +import java.util.concurrent.TimeUnit; + + +@Slf4j +public class NewFeatureForJavatron440 { + + private final String testNetAccountKey = Configuration.getByPath("testng.conf") + .getString("foundationAccount.key2"); + private final byte[] testNetAccountAddress = PublicMethed.getFinalAddress(testNetAccountKey); + byte[] contractC = null; + byte[] contractD = null; + byte[] create2Address; + String create2Str; + ECKey ecKey1 = new ECKey(Utils.getRandom()); + byte[] contractExcAddress = ecKey1.getAddress(); + String contractExcKey = ByteArray.toHexString(ecKey1.getPrivKeyBytes()); + private Long maxFeeLimit = Configuration.getByPath("testng.conf") + .getLong("defaultParameter.maxFeeLimit"); + private ManagedChannel channelFull = null; + private WalletGrpc.WalletBlockingStub blockingStubFull = null; + + private String fullnode = Configuration.getByPath("testng.conf") + .getStringList("fullnode.ip.list").get(0); + + @BeforeSuite + public void beforeSuite() { + Wallet wallet = new Wallet(); + Wallet.setAddressPreFixByte(Parameter.CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); + } + + /** + * constructor. + */ + + @BeforeClass(enabled = true) + public void beforeClass() { + PublicMethed.printAddress(contractExcKey); + channelFull = ManagedChannelBuilder.forTarget(fullnode) + .usePlaintext(true) + .build(); + blockingStubFull = WalletGrpc.newBlockingStub(channelFull); + + Assert.assertTrue(PublicMethed + .sendcoin(contractExcAddress, 300100_000_000L, + testNetAccountAddress, testNetAccountKey, blockingStubFull)); + PublicMethed.waitProduceNextBlock(blockingStubFull); + + String filePath = "src/test/resources/soliditycode/NewFeatureJavatron440.sol"; + String contractName = "C"; + HashMap retMap = PublicMethed.getBycodeAbi(filePath, contractName); + + String code = retMap.get("byteCode").toString(); + String abi = retMap.get("abI").toString(); + contractC = PublicMethed.deployContract(contractName, abi, code, "", maxFeeLimit, + 500000000L, 100, null, contractExcKey, + contractExcAddress, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + SmartContractOuterClass.SmartContract smartContract = PublicMethed.getContract(contractC, + blockingStubFull); + Assert.assertNotNull(smartContract.getAbi()); + + contractName = "D"; + retMap = PublicMethed.getBycodeAbi(filePath, contractName); + + code = retMap.get("byteCode").toString(); + abi = retMap.get("abI").toString(); + contractD = PublicMethed.deployContract(contractName, abi, code, "", maxFeeLimit, + 500000000L, 100, null, contractExcKey, + contractExcAddress, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + smartContract = PublicMethed.getContract(contractD, + blockingStubFull); + Assert.assertNotNull(smartContract.getAbi()); + } + + + @Test(enabled = true, description = "test get base fee value = commit.No 11 energy fee") + public void test01baseFee() { + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(contractC, + "baseFee()", "#", false, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + Assert.assertEquals(true, transactionExtention.getResult().getResult()); + Assert.assertEquals("SUCESS", + transactionExtention.getTransaction().getRet(0).getRet().toString()); + long basefee = ByteArray.toLong(transactionExtention.getConstantResult(0).toByteArray()); + logger.info("basefee: " + basefee); + long energyfee; + Protocol.ChainParameters chainParameters = blockingStubFull + .getChainParameters(GrpcAPI.EmptyMessage.newBuilder().build()); + Optional getChainParameters = Optional.ofNullable(chainParameters); + logger.info(Long.toString(getChainParameters.get().getChainParameterCount())); + String key = ""; + boolean flag = false; + for (Integer i = 0; i < getChainParameters.get().getChainParameterCount(); i++) { + key = getChainParameters.get().getChainParameter(i).getKey(); + if("getEnergyFee".equals(key)){ + energyfee = getChainParameters.get().getChainParameter(i).getValue(); + logger.info("energyfee: " + energyfee); + Assert.assertEquals(basefee, energyfee); + flag = true; + } + } + Assert.assertTrue(flag); + } + + @Test(enabled = true, description = "test get gas price value = commit.No 11 energy fee") + public void test02GasPrice() { + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(contractC, + "gasPrice()", "#", false, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + Assert.assertEquals(true, transactionExtention.getResult().getResult()); + Assert.assertEquals("SUCESS", + transactionExtention.getTransaction().getRet(0).getRet().toString()); + } + + @Test(enabled = true, description = "get create2 address, test get base fee ") + public void test03BaseFeeFromCreate2() { + String methedStr = "deploy(uint256)"; + String argsStr = "1"; + String txid = PublicMethed.triggerContract(contractD, methedStr, argsStr, + false,0,maxFeeLimit, contractExcAddress, contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + Optional info = PublicMethed.getTransactionInfoById(txid, blockingStubFull); + Assert.assertEquals(0, info.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.SUCCESS, + info.get().getReceipt().getResult()); + + String create2Str = + "41" + ByteArray.toHexString(info.get().getContractResult(0).toByteArray()) + .substring(24); + logger.info("hex create2 address: " + create2Str); + create2Address = ByteArray.fromHexString(create2Str); + logger.info("create2Address: " + Base58.encode58Check(create2Address)); + + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(create2Address, + "baseFeeOnly()", "#", false, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); +// System.out.println("111111111: " + transactionExtention.toString()); + Assert.assertEquals(true, transactionExtention.getResult().getResult()); + Assert.assertEquals("SUCESS", + transactionExtention.getTransaction().getRet(0).getRet().toString()); + long basefee = ByteArray.toLong(transactionExtention.getConstantResult(0).toByteArray()); + logger.info("basefee: " + basefee); + long energyfee; + Protocol.ChainParameters chainParameters = blockingStubFull + .getChainParameters(GrpcAPI.EmptyMessage.newBuilder().build()); + Optional getChainParameters = Optional.ofNullable(chainParameters); + logger.info(Long.toString(getChainParameters.get().getChainParameterCount())); + String key = ""; + boolean flag = false; + for (Integer i = 0; i < getChainParameters.get().getChainParameterCount(); i++) { + key = getChainParameters.get().getChainParameter(i).getKey(); + if("getEnergyFee".equals(key)){ + energyfee = getChainParameters.get().getChainParameter(i).getValue(); + logger.info("energyfee: " + energyfee); + Assert.assertEquals(basefee, energyfee); + flag = true; + } + } + Assert.assertTrue(flag); + + transactionExtention = PublicMethed + .triggerConstantContractForExtention(create2Address, + "gasPriceOnly()", "#", false, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); +// System.out.println("22222: " + transactionExtention.toString()); + + Assert.assertEquals(true, transactionExtention.getResult().getResult()); + Assert.assertEquals("SUCESS", + transactionExtention.getTransaction().getRet(0).getRet().toString()); + long gasprice = ByteArray.toLong(transactionExtention.getConstantResult(0).toByteArray()); + logger.info("gasprice: " + gasprice); + Assert.assertEquals(basefee, gasprice); + } + + @Test(enabled = true, description = "call can use 63/64 energy in new contract") + public void test04CallEnergy() { + ECKey ecKey1 = new ECKey(Utils.getRandom()); + byte[] transferToAddress = ecKey1.getAddress(); + String transferToKey = ByteArray.toHexString(ecKey1.getPrivKeyBytes()); + PublicMethed.printAddress(transferToKey); + + String methedStr = "testCall(address,address)"; + String argsStr = "\"" + Base58.encode58Check(contractD) + "\"," + "\"" + Base58.encode58Check(transferToAddress) + "\""; + String txid = PublicMethed.triggerContract(contractC, methedStr, argsStr, + false,0,maxFeeLimit, contractExcAddress, contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + Optional info = PublicMethed.getTransactionInfoById(txid, blockingStubFull); + System.out.println("0000000" + info.toString()); + Protocol.Account testAccount = PublicMethed.queryAccountByAddress(transferToAddress,blockingStubFull); + System.out.println("testAccount: " + testAccount.toString()); + Assert.assertEquals(0, info.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.SUCCESS, + info.get().getReceipt().getResult()); + Assert.assertTrue(info.get().getInternalTransactions(0).getRejected()); + Assert.assertTrue(info.get().getReceipt().getEnergyFee() < maxFeeLimit); + } + + @Test(enabled = true, description = "create2 address call can use 63/64 energy in new contract") + public void test05Create2AddressCallEnergy() { + ECKey ecKey1 = new ECKey(Utils.getRandom()); + byte[] transferToAddress = ecKey1.getAddress(); + String transferToKey = ByteArray.toHexString(ecKey1.getPrivKeyBytes()); + PublicMethed.printAddress(transferToKey); + String methedStr = "deploy(uint256)"; + String argsStr = "1"; + String txid = PublicMethed.triggerContract(contractD, methedStr, argsStr, + false,0,maxFeeLimit, contractExcAddress, contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + Optional info = PublicMethed.getTransactionInfoById(txid, blockingStubFull); + Assert.assertEquals(0, info.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.SUCCESS, + info.get().getReceipt().getResult()); + + String create2Str = + "41" + ByteArray.toHexString(info.get().getContractResult(0).toByteArray()) + .substring(24); + logger.info("hex create2 address: " + create2Str); + create2Address = ByteArray.fromHexString(create2Str); + logger.info("create2Address: " + Base58.encode58Check(create2Address)); + + methedStr = "testCall(address,address)"; + argsStr = "\"" + Base58.encode58Check(contractD) + "\"," + "\"" + Base58.encode58Check(transferToAddress) + "\""; + txid = PublicMethed.triggerContract(create2Address, methedStr, argsStr, + false,0,maxFeeLimit, contractExcAddress, contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + info = PublicMethed.getTransactionInfoById(txid, blockingStubFull); + System.out.println("0000000" + info.toString()); + + Protocol.Account testAccount = PublicMethed.queryAccountByAddress(transferToAddress,blockingStubFull); + System.out.println("testAccount: " + testAccount.toString()); + Assert.assertEquals("",testAccount.toString()); + Assert.assertEquals(0, info.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.SUCCESS, + info.get().getReceipt().getResult()); + Assert.assertTrue(info.get().getInternalTransactions(0).getRejected()); + Assert.assertTrue(info.get().getReceipt().getEnergyFee() < maxFeeLimit); + } + + + /** + * constructor. + */ + @AfterClass + public void shutdown() throws InterruptedException { + PublicMethed.freedResource(contractExcAddress, contractExcKey, + testNetAccountAddress, blockingStubFull); + if (channelFull != null) { + channelFull.shutdown().awaitTermination(5, TimeUnit.SECONDS); + } + } + + +} + diff --git a/framework/src/test/resources/soliditycode/NewFeatureJavatron440.sol b/framework/src/test/resources/soliditycode/NewFeatureJavatron440.sol new file mode 100644 index 00000000000..2416db39f32 --- /dev/null +++ b/framework/src/test/resources/soliditycode/NewFeatureJavatron440.sol @@ -0,0 +1,58 @@ +contract C { + constructor() public payable{} + + function baseFee() external view returns (uint ret) { + assembly { + ret := basefee() + } + assert(block.basefee == ret); + } + + function baseFeeOnly() external view returns (uint ret) { + assembly { + ret := basefee() + } + } + + function gasPrice() external view returns (uint ret) { + assembly { + ret := basefee() + } + assert(tx.gasprice == ret); + } + + function gasPriceOnly() external view returns (uint) { + return tx.gasprice; + } + + function testCall(address payable caller, address payable transferTo) public { + caller.call(abi.encodeWithSignature("transfer(address)",transferTo)); + } + +} + +contract D { + constructor() public payable{} + + function deploy(uint256 salt) public returns(address){ + address addr; + bytes memory code = type(C).creationCode; + assembly { + addr := create2(0, add(code, 0x20), mload(code), salt) + } + return addr; + } + uint sum = 0; + function transfer(address payable transerTo) public { + for (uint i = 0; i < type(uint256).max; i++) + sum = 0; + for (uint j = 0; j < type(uint8).max; j++) + sum += j; + transerTo.transfer(1); + } +} + + + + + From 902a5e52421ca9ba2c5e7df09d29ba0841eb5def Mon Sep 17 00:00:00 2001 From: daxinzang1 <280474930@qq.com> Date: Wed, 8 Sep 2021 14:58:10 +0800 Subject: [PATCH 223/341] Add json rpc test case --- .../dailybuild/jsonrpc/Accounts001.java | 664 ++++++++++++++++++ .../jsonrpc/BuildTransaction001.java | 28 +- .../dailybuild/jsonrpc/GetBlock001.java | 31 + .../wallet/onlinestress/TransactionCheck.java | 52 ++ framework/src/test/resources/testng.conf | 16 +- 5 files changed, 786 insertions(+), 5 deletions(-) create mode 100644 framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java create mode 100644 framework/src/test/java/stest/tron/wallet/onlinestress/TransactionCheck.java diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java new file mode 100644 index 00000000000..100a90afd2e --- /dev/null +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java @@ -0,0 +1,664 @@ +package stest.tron.wallet.dailybuild.jsonrpc; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; + +import io.grpc.ManagedChannelBuilder; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpResponse; +import org.junit.Assert; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; +import org.tron.api.WalletGrpc; +import org.tron.common.utils.ByteArray; +import stest.tron.wallet.common.client.utils.HttpMethed; +import stest.tron.wallet.common.client.utils.JsonRpcBase; + +@Slf4j +public class Accounts001 extends JsonRpcBase { + private JSONObject responseContent; + private HttpResponse response; + String realGasPrice; + String bid = null; + int indexNum = 0; + String indexHex = null; + JSONObject result = null; + String transacionHash = null; + String blockHash = null; + String blockNumHex = null; + String parentHash = null; + String txTrieRoot = null; + String witnessAddress = null; + String gas = null; + long blockTimeStamp = 0; + + + /** + * constructor. + */ + @BeforeClass(enabled = true) + public void beforeClass() { + channelFull = ManagedChannelBuilder.forTarget(fullnode) + .usePlaintext(true) + .build(); + blockingStubFull = WalletGrpc.newBlockingStub(channelFull); + } + + + + + @Test(enabled = true, description = "Json rpc api of eth_accounts") + public void test01JsonRpcApiTestForEthAccounts() throws Exception { + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("eth_accounts", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + List result = new ArrayList(); + logger.info(String.valueOf(result)); + Assert.assertEquals(responseContent.get("result"), result); + } + + @Test(enabled = true, description = "Json rpc api of eth_blockNumber") + public void test02JsonRpcApiTestForEthBlockNumber() throws Exception { + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("eth_blockNumber", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + responseContent.get("result"); + String blockNum = responseContent.getString("result").substring(2); + int blocknum1 = Integer.parseInt(blockNum, 16); + response = HttpMethed.getNowBlock(httpFullNode); + responseContent = HttpMethed.parseResponseContent(response); + int blocknum2 = + responseContent + .getJSONObject("block_header") + .getJSONObject("raw_data") + .getInteger("number"); + logger.info(String.valueOf(blocknum1)); + logger.info(String.valueOf(blocknum2)); + Assert.assertTrue(Math.abs(blocknum1 - blocknum2) <= 2); + } + + @Test(enabled = true, description = "Json rpc api of eth_chainId") + public void test04JsonRpcApiTestForEthChainId() throws Exception { + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("eth_chainId", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + responseContent.get("result"); + String blockId1 = responseContent.get("result").toString().substring(2); + response = HttpMethed.getBlockByNum(httpFullNode, 0); + responseContent = HttpMethed.parseResponseContent(response); + String blockId2 = responseContent.getString("blockID"); + logger.info(blockId1); + logger.info(blockId2); + Assert.assertEquals(blockId1, blockId2); + } + + @Test(enabled = true, description = "Json rpc api of eth_gasPrice") + public void test07JsonRpcApiTestForEthGasPrice() throws Exception { + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("eth_gasPrice", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + responseContent.get("result"); + String gasPrice = responseContent.get("result").toString().substring(2); + int gasPrice1 = Integer.parseInt(gasPrice, 16); + logger.info(String.valueOf(gasPrice1)); + response = HttpMethed.getChainParameter(httpFullNode); + responseContent = HttpMethed.parseResponseContent(response); + JSONArray temp; + temp = responseContent.getJSONArray("chainParameter"); + int gasPrice2 = 0; + for (int i = 0; i < temp.size(); i++) { + if (temp.getJSONObject(i).get("key").equals("getEnergyFee")) { + gasPrice2 = temp.getJSONObject(i).getInteger("value"); + } + } + logger.info(String.valueOf(gasPrice2)); + Assert.assertEquals(gasPrice1, gasPrice2); + } + + @Test(enabled = true, description = "Json rpc api of eth_getBalance") + public void test08JsonRpcApiTestForEthGetBalance() throws Exception { + JsonArray params = new JsonArray(); + params.add(ByteArray.toHexString(foundationAccountAddress)); + params.add("latest"); + JsonObject requestBody = getJsonRpcBody("eth_getBalance", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String balance = responseContent.getString("result").substring(2); + Long balance1 = Long.parseLong(balance, 16); + Long balance2 = HttpMethed.getBalance(httpFullNode, foundationAccountAddress); + logger.info(balance1.toString()); + logger.info(balance2.toString()); + Assert.assertEquals(balance1, balance2); + } + // todo : + + @Test(enabled = false, description = "Json rpc api of eth_getBlockByHash") + public void test09JsonRpcApiTestForEthGetBlockByHash() throws Exception { + JsonArray params = new JsonArray(); + params.add(blockHash); + JsonObject requestBody = getJsonRpcBody("eth_getBlockByHash", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + JSONObject getBlockByHashResult = responseContent.getJSONObject("result"); + Assert.assertNull(getBlockByHashResult.getString("nonce")); + Assert.assertNull(getBlockByHashResult.getString("sha3Uncles")); + Assert.assertNull(getBlockByHashResult.getString("receiptsRoot")); + Assert.assertNull(getBlockByHashResult.getString("difficulty")); + Assert.assertNull(getBlockByHashResult.getString("totalDifficulty")); + Assert.assertNull(getBlockByHashResult.getString("extraData")); + Assert.assertEquals(getBlockByHashResult.getString("number"), blockNumHex); + Assert.assertEquals(getBlockByHashResult.getString("hash"), "0x" + bid); + Assert.assertEquals(getBlockByHashResult.getString("parentHash"), "0x" + parentHash); + Assert.assertEquals(getBlockByHashResult.getString("transactionsRoot"), "0x" + txTrieRoot); + Assert.assertEquals(getBlockByHashResult.getString("miner"), "0x" + witnessAddress); + // Assert.assertEquals(getBlockByHashResult.getString("size"), "0x"+witness_address); + Assert.assertEquals(getBlockByHashResult.getString("gasUsed"), gas); + // Assert.assertEquals(getBlockByHashResult.getString("gasLimit"), gas); + Assert.assertEquals( + Long.parseLong(getBlockByHashResult.getString("timestamp").substring(2), 16), + blockTimeStamp); + Long.parseLong(getBlockByHashResult.getString("timestamp").substring(2), 16); + } + + @Test(enabled = true, description = "Json rpc api of eth_getBlockTransactionCountByHash") + public void test11JsonRpcApiTestForEthGetBlockTransactionCountByHash() throws Exception { + response = HttpMethed.getNowBlock(httpFullNode); + responseContent = HttpMethed.parseResponseContent(response); + String blockIdHash = responseContent.getString("blockID"); + long blockNum = + responseContent.getJSONObject("block_header").getJSONObject("raw_data").getLong("number"); + logger.info("blockNum:" + blockNum); + JsonArray params = new JsonArray(); + params.add("0x" + blockIdHash); + logger.info("0x" + blockIdHash); + JsonObject requestBody = getJsonRpcBody("eth_getBlockTransactionCountByHash", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String transactionNum = responseContent.getString("result").substring(2); + int transactionNum1 = Integer.parseInt(transactionNum, 16); + logger.info(String.valueOf(transactionNum1)); + response = HttpMethed.getTransactionCountByBlocknum(httpFullNode, blockNum); + responseContent = HttpMethed.parseResponseContent(response); + int transactionNum2 = responseContent.getInteger("count"); + logger.info(String.valueOf(transactionNum2)); + Assert.assertEquals(transactionNum1, transactionNum2); + } + + @Test(enabled = true, description = "Json rpc api of eth_getBlockTransactionCountByNumber") + public void test12JsonRpcApiTestForEthGetBlockTransactionCountByNum01() throws Exception { + response = HttpMethed.getNowBlock(httpFullNode); + responseContent = HttpMethed.parseResponseContent(response); + long blockNum = + responseContent.getJSONObject("block_header").getJSONObject("raw_data").getLong("number"); + JsonArray params = new JsonArray(); + params.add(blockNum); + logger.info(String.valueOf(blockNum)); + JsonObject requestBody = getJsonRpcBody("eth_getBlockTransactionCountByNumber", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String transactionNum = responseContent.getString("result").substring(2); + int transactionNum1 = Integer.parseInt(transactionNum, 16); + logger.info(String.valueOf(transactionNum1)); + response = HttpMethed.getTransactionCountByBlocknum(httpFullNode, blockNum); + responseContent = HttpMethed.parseResponseContent(response); + int transactionNum2 = responseContent.getInteger("count"); + logger.info(String.valueOf(transactionNum2)); + Assert.assertEquals(transactionNum1, transactionNum2); + } + + @Test(enabled = true, description = "Json rpc api of eth_getBlockTransactionCountByNumber") + public void test12JsonRpcApiTestForEthGetBlockTransactionCountByNum02() throws Exception { + response = HttpMethed.getNowBlock(httpFullNode); + responseContent = HttpMethed.parseResponseContent(response); + JsonArray params = new JsonArray(); + params.add("earliest"); + JsonObject requestBody = getJsonRpcBody("eth_getBlockTransactionCountByNumber", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String transactionNum = responseContent.getString("result").substring(2); + int transactionNum1 = Integer.parseInt(transactionNum, 16); + logger.info(String.valueOf(transactionNum1)); + response = HttpMethed.getTransactionCountByBlocknum(httpFullNode, 0); + responseContent = HttpMethed.parseResponseContent(response); + int transactionNum2 = responseContent.getInteger("count"); + logger.info(String.valueOf(transactionNum2)); + Assert.assertEquals(transactionNum1, transactionNum2); + } + + @Test(enabled = true, description = "Json rpc api of eth_getTransactionByBlockNumberAndIndex") + public void test15JsonRpcApiTestForEthGetTransactionByBlockNumberAndIndex() throws Exception { + logger.info("15blockNum:" + blockNum); + blockNumHex = "0x" + Integer.toHexString(blockNum); + logger.info("blockNumHex:" + blockNumHex); + JsonArray params = new JsonArray(); + params.add(blockNumHex); + + indexNum = 0; + response = HttpMethed.getBlockByNum(httpFullNode, blockNum); + responseContent = HttpMethed.parseResponseContent(response); + parentHash = + responseContent + .getJSONObject("block_header") + .getJSONObject("raw_data") + .getString("parentHash"); + txTrieRoot = + responseContent + .getJSONObject("block_header") + .getJSONObject("raw_data") + .getString("txTrieRoot"); + witnessAddress = + responseContent + .getJSONObject("block_header") + .getJSONObject("raw_data") + .getString("witness_address"); + JSONObject getBlockByNumResult = null; + for (int i = 0; i < responseContent.getJSONArray("transactions").size(); i++) { + if (txid.equals( + responseContent.getJSONArray("transactions").getJSONObject(i).getString("txID"))) { + indexNum = i; + getBlockByNumResult = responseContent.getJSONArray("transactions").getJSONObject(i); + bid = responseContent.getString("blockID"); + System.out.println(bid); + break; + } + } + logger.info(String.valueOf(indexNum)); + indexHex = "0x" + Integer.toHexString(indexNum); + logger.info("indexHex"); + params.add(indexHex); + + JsonObject requestBody = getJsonRpcBody("eth_getTransactionByBlockNumberAndIndex", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + result = responseContent.getJSONObject("result"); + + Map jsonrpcResult = new HashMap(); + for (Map.Entry entry : result.entrySet()) { + jsonrpcResult.put(entry.getKey(), entry.getValue()); + } + transacionHash = jsonrpcResult.get("hash").toString(); + blockHash = jsonrpcResult.get("blockHash").toString(); + logger.info("jsonrpcResult:" + jsonrpcResult); + response = HttpMethed.getTransactionInfoByBlocknum(httpFullNode, blockNum); + gas = jsonrpcResult.get("gas").toString(); + System.out.println(blockNum); + List responseContent1 = HttpMethed.parseResponseContentArray(response); + blockTimeStamp = responseContent1.get(0).getLong("blockTimeStamp"); + Assert.assertEquals( + jsonrpcResult.get("gas").toString(), + "0x" + + Long.toHexString( + responseContent1.get(0).getJSONObject("receipt").getLong("energy_usage_total"))); + Assert.assertNull(jsonrpcResult.get("nonce")); + Assert.assertEquals( + jsonrpcResult.get("hash").toString(), "0x" + getBlockByNumResult.getString("txID")); + Assert.assertEquals(jsonrpcResult.get("blockHash").toString(), "0x" + bid); + Assert.assertEquals(jsonrpcResult.get("blockNumber").toString(), blockNumHex); + Assert.assertEquals(jsonrpcResult.get("transactionIndex").toString(), indexHex); + Assert.assertEquals( + jsonrpcResult.get("from").toString(), + "0x" + + getBlockByNumResult + .getJSONObject("raw_data") + .getJSONArray("contract") + .getJSONObject(0) + .getJSONObject("parameter") + .getJSONObject("value") + .getString("owner_address") + .substring(2)); + Assert.assertEquals( + jsonrpcResult.get("to").toString(), + "0x" + + getBlockByNumResult + .getJSONObject("raw_data") + .getJSONArray("contract") + .getJSONObject(0) + .getJSONObject("parameter") + .getJSONObject("value") + .getString("contract_address") + .substring(2)); + // Assert.assertEquals(jsonrpcResult.get("gasPrice").toString(),realGasPrice); + Assert.assertEquals(jsonrpcResult.get("value").toString(), "0x1389"); + + String data; + if (getBlockByNumResult.getJSONObject("raw_data").getString("data") == null) { + data = "0x"; + } else { + data = getBlockByNumResult.getJSONObject("raw_data").getString("data").substring(2); + } + Assert.assertEquals(jsonrpcResult.get("input").toString(), data); + + long temp = Long.parseLong(getBlockByNumResult.getString("signature").substring(130, 131), 16); + long v = Long.parseLong(getBlockByNumResult.getString("signature").substring(130, 132), 16); + if (temp < 27) { + v += 27; + } + Assert.assertEquals(Long.parseLong(jsonrpcResult.get("v").toString().substring(2), 16), v); + Assert.assertEquals( + jsonrpcResult.get("r").toString().substring(2), + getBlockByNumResult.getString("signature").substring(2, 66)); + Assert.assertEquals( + jsonrpcResult.get("s").toString().substring(2), + getBlockByNumResult.getString("signature").substring(66, 130)); + } + + @Test(enabled = true, description = "Json rpc api of eth_getTransactionByBlockHashAndIndex") + public void test16JsonRpcApiTestForEthGetTransactionByBlockHashAndIndex() throws Exception { + JsonArray params = new JsonArray(); + params.add("0x" + bid); + params.add(indexHex); + logger.info("indexHex:" + indexHex); + + JsonObject requestBody = getJsonRpcBody("eth_getTransactionByBlockHashAndIndex", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + JSONObject resultForGetTransactionByBlockHashAndIndex = responseContent.getJSONObject("result"); + Assert.assertEquals(result, resultForGetTransactionByBlockHashAndIndex); + } + + @Test(enabled = true, description = "Json rpc api of eth_getTransactionByHash") + public void test17JsonRpcApiTestForEthGetTransactionByHash() throws Exception { + JsonArray params = new JsonArray(); + params.add(transacionHash); + + JsonObject requestBody = getJsonRpcBody("eth_getTransactionByHash", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + JSONObject result1 = responseContent.getJSONObject("result"); + Assert.assertEquals(result, result1); + } + + @Test(enabled = true, description = "Json rpc api of eth_getWork") + public void test23JsonRpcApiTestForEthGetWork() throws Exception { + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("eth_getWork", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String result = responseContent.getString("result"); + int resultLen = result.length(); + String result1 = result.substring(4, resultLen - 12); + response = HttpMethed.getNowBlock(httpFullNode); + responseContent = HttpMethed.parseResponseContent(response); + String result2 = responseContent.getString("blockID"); + logger.info(result1); + logger.info(result2); + Assert.assertEquals(result1, result2); + } + + @Test(enabled = true, description = "Json rpc api of eth_hashrate") + public void test24JsonRpcApiTestForEthHashRate() throws Exception { + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("eth_hashrate", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String result = responseContent.getString("result"); + logger.info(result); + Assert.assertEquals(result, "0x0"); + } + + @Test(enabled = true, description = "Json rpc api of eth_protocolVersion") + public void test26JsonRpcApiTestForEthProtocolVersion() throws Exception { + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("eth_protocolVersion", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String protocolVersion = responseContent.getString("result").substring(2); + Long protocolVersion1 = Long.parseLong(protocolVersion, 16); + System.out.println(protocolVersion1); + response = HttpMethed.getNowBlock(httpFullNode); + responseContent = HttpMethed.parseResponseContent(response); + Long protocolVersion2 = + responseContent.getJSONObject("block_header").getJSONObject("raw_data").getLong("version"); + logger.info(protocolVersion1.toString()); + logger.info(protocolVersion2.toString()); + Assert.assertEquals(protocolVersion1, protocolVersion2); + } + + @Test(enabled = true, description = "Json rpc api of eth_syncing") + public void test27JsonRpcApiTestForEthSyncing() throws Exception { + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("eth_syncing", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + JSONObject temp = responseContent.getJSONObject("result"); + logger.info(temp.toString()); + Assert.assertTrue(temp.containsKey("startingBlock")); + Assert.assertTrue(temp.containsKey("currentBlock")); + Assert.assertTrue(temp.containsKey("highestBlock")); + } + + @Test(enabled = true, description = "Json rpc api of net_peerCount") + public void test29JsonRpcApiTestForNetPeerCount() throws Exception { + + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("net_peerCount", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String result = responseContent.getString("result"); + logger.info(result); + Assert.assertNotNull(result); + } + + @Test(enabled = true, description = "Json rpc api of net_version") + public void test30JsonRpcApiTestForEthVersion() throws Exception { + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("net_version", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String firstBlockHash1 = responseContent.getString("result").substring(2); + response = HttpMethed.getBlockByNum(httpFullNode, 0); + responseContent = HttpMethed.parseResponseContent(response); + String firstBlockHash2 = responseContent.getString("blockID"); + logger.info(firstBlockHash1); + logger.info(firstBlockHash2); + Assert.assertEquals(firstBlockHash1, firstBlockHash2); + } + + @Test(enabled = true, description = "Json rpc api of web3_sha3") + public void test32JsonRpcApiTestForWeb3Sha3() throws Exception { + JsonArray params = new JsonArray(); + params.add("0x08"); + JsonObject requestBody1 = getJsonRpcBody("web3_sha3", params); + response = getEthHttps(ethHttpsNode, requestBody1); + responseContent = HttpMethed.parseResponseContent(response); + System.out.println(responseContent); + String result1 = responseContent.getString("result"); + JsonObject requestBody2 = getJsonRpcBody("web3_sha3", params); + response = getJsonRpc(jsonRpcNode, requestBody2); + responseContent = HttpMethed.parseResponseContent(response); + String result2 = responseContent.getString("result"); + Assert.assertEquals(result1, result2); + System.out.println(result2); + } + + @Test(enabled = true, description = "Json rpc api of eth_compileLLL") + public void test33JsonRpcApiTestForEthCompileLll() throws Exception { + JsonArray params = new JsonArray(); + params.add("(returnlll (suicide (caller)))"); + JsonObject requestBody1 = getJsonRpcBody("eth_compileLLL", params); + response = getJsonRpc(jsonRpcNode, requestBody1); + responseContent = HttpMethed.parseResponseContent(response); + String errorMessage = responseContent.getJSONObject("error").getString("message"); + Assert.assertEquals(errorMessage, "the method eth_compileLLL does not exist/is not available"); + } + + @Test(enabled = true, description = "Json rpc api of eth_compileSerpent") + public void test34JsonRpcApiTestForEthCompileSerpent() throws Exception { + JsonArray params = new JsonArray(); + params.add("/* some serpent */"); + JsonObject requestBody = getJsonRpcBody("eth_compileSerpent", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String errorMessage = responseContent.getJSONObject("error").getString("message"); + Assert.assertEquals( + errorMessage, "the method eth_compileSerpent does not exist/is not available"); + } + + @Test(enabled = true, description = "Json rpc api of eth_compileSolidity") + public void test35JsonRpcApiTestForEthCompileSolidity() throws Exception { + JsonArray params = new JsonArray(); + params.add("contract test { function multiply(uint a) returns(uint d) { return a * 7; } }"); + JsonObject requestBody = getJsonRpcBody("eth_compileSolidity", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String errorMessage = responseContent.getJSONObject("error").getString("message"); + Assert.assertEquals( + errorMessage, "the method eth_compileSolidity does not exist/is not available"); + } + + @Test(enabled = true, description = "Json rpc api of eth_getCompilers") + public void test36JsonRpcApiTestForEthCompileSolidity() throws Exception { + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("eth_getCompilers", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String errorMessage = responseContent.getJSONObject("error").getString("message"); + Assert.assertEquals( + errorMessage, "the method eth_getCompilers does not exist/is not available"); + } + + @Test(enabled = true, description = "Json rpc api of eth_getTransactionCount") + public void test37JsonRpcApiTestForEthGetTransactionCount() throws Exception { + JsonArray params = new JsonArray(); + params.add("0x407d73d8a49eeb85d32cf465507dd71d507100c1"); + params.add("latest"); + JsonObject requestBody = getJsonRpcBody("eth_getTransactionCount", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String errorMessage = responseContent.getJSONObject("error").getString("message"); + Assert.assertEquals( + errorMessage, "the method eth_getTransactionCount does not exist/is not available"); + } + + @Test(enabled = true, description = "Json rpc api of eth_sendRawTransaction") + public void test38JsonRpcApiTestForEthSendRawTransaction() throws Exception { + JsonArray params = new JsonArray(); + params.add("0x234"); + JsonObject requestBody = getJsonRpcBody("eth_sendRawTransaction", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String errorMessage = responseContent.getJSONObject("error").getString("message"); + Assert.assertEquals( + errorMessage, "the method eth_sendRawTransaction does not exist/is not available"); + } + + @Test(enabled = true, description = "Json rpc api of eth_sendTransaction") + public void test39JsonRpcApiTestForEthSendTransaction() throws Exception { + JsonArray params = new JsonArray(); + JsonObject temp = new JsonObject(); + params.add(temp); + temp.addProperty("from", "0xb60e8dd61c5d32be8058bb8eb970870f07233155"); + temp.addProperty("to", "0xd46e8dd67c5d32be8058bb8eb970870f07244567"); + temp.addProperty("gas", "0x76c0"); + temp.addProperty("gasPrice", "0x9184e72a000"); + temp.addProperty( + "data", + "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"); + temp.addProperty("value", "0x9184e72a"); + + JsonObject requestBody = getJsonRpcBody("eth_sendTransaction", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String errorMessage = responseContent.getJSONObject("error").getString("message"); + Assert.assertEquals( + errorMessage, "the method eth_sendTransaction does not exist/is not available"); + } + + @Test(enabled = true, description = "Json rpc api of eth_sign") + public void test40JsonRpcApiTestForEthSign() throws Exception { + JsonArray params = new JsonArray(); + params.add("0x9b2055d370f73ec7d8a03e965129118dc8f5bf83"); + params.add("0xdeadbeaf"); + JsonObject requestBody = getJsonRpcBody("eth_sign", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String errorMessage = responseContent.getJSONObject("error").getString("message"); + Assert.assertEquals(errorMessage, "the method eth_sign does not exist/is not available"); + } + + @Test(enabled = true, description = "Json rpc api of eth_signTransaction") + public void test41JsonRpcApiTestForEthSignTransaction() throws Exception { + JsonArray params = new JsonArray(); + JsonObject temp = new JsonObject(); + params.add(temp); + temp.addProperty( + "data", + "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"); + temp.addProperty("from", "0xb60e8dd61c5d32be8058bb8eb970870f07233155"); + temp.addProperty("gas", "0x76c0"); + temp.addProperty("gasPrice", "0x9184e72a000"); + temp.addProperty("to", "0xd46e8dd67c5d32be8058bb8eb970870f07244567"); + temp.addProperty("value", "0x9184e72a"); + + JsonObject requestBody = getJsonRpcBody("eth_signTransaction", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String errorMessage = responseContent.getJSONObject("error").getString("message"); + Assert.assertEquals( + errorMessage, "the method eth_signTransaction does not exist/is not available"); + } + + @Test(enabled = true, description = "Json rpc api of eth_submitWork") + public void test42JsonRpcApiTestForEthSubmitWork() throws Exception { + JsonArray params = new JsonArray(); + params.add("0x0000000000000001"); + params.add("0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"); + params.add("0xD1GE5700000000000000000000000000D1GE5700000000000000000000000000"); + JsonObject requestBody = getJsonRpcBody("eth_submitWork", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String errorMessage = responseContent.getJSONObject("error").getString("message"); + Assert.assertEquals(errorMessage, "the method eth_submitWork does not exist/is not available"); + } + + @Test(enabled = true, description = "Json rpc api of parity_nextNonce") + public void test43JsonRpcApiTestForParityNextNonce() throws Exception { + JsonArray params = new JsonArray(); + params.add("0x9b2055d370f73ec7d8a03e965129118dc8f5bf83"); + JsonObject requestBody = getJsonRpcBody("parity_nextNonce", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String errorMessage = responseContent.getJSONObject("error").getString("message"); + Assert.assertEquals( + errorMessage, "the method parity_nextNonce does not exist/is not available"); + } + + @Test(enabled = true, description = "Json rpc api of eth_submitHashrate") + public void test44JsonRpcApiTestForEthSubmitHashrate() throws Exception { + JsonArray params = new JsonArray(); + params.add("0x0000000000000000000000000000000000000000000000000000000000500000"); + params.add("0x59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c"); + JsonObject requestBody = getJsonRpcBody("eth_submitHashrate", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String errorMessage = responseContent.getJSONObject("error").getString("message"); + Assert.assertEquals( + errorMessage, "the method eth_submitHashrate does not exist/is not available"); + } + + + /** + * constructor. + */ + + @AfterClass + public void shutdown() throws InterruptedException { + if (channelFull != null) { + channelFull.shutdown().awaitTermination(5, TimeUnit.SECONDS); + } + } + + +} diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/BuildTransaction001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/BuildTransaction001.java index 06d6ebae4e7..0521f094147 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/BuildTransaction001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/BuildTransaction001.java @@ -5,10 +5,15 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.protobuf.ByteString; +import io.grpc.ManagedChannelBuilder; +import java.util.concurrent.TimeUnit; import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpResponse; import org.junit.Assert; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; +import org.tron.api.WalletGrpc; import org.tron.common.crypto.ECKey; import org.tron.common.utils.ByteArray; import org.tron.common.utils.Utils; @@ -33,7 +38,16 @@ public class BuildTransaction001 extends JsonRpcBase { byte[] receiverAddress = ecKey1.getAddress(); final String receiverKey = ByteArray.toHexString(ecKey1.getPrivKeyBytes()); - + /** + * constructor. + */ + @BeforeClass(enabled = true) + public void beforeClass() { + channelFull = ManagedChannelBuilder.forTarget(fullnode) + .usePlaintext(true) + .build(); + blockingStubFull = WalletGrpc.newBlockingStub(channelFull); + } @@ -66,6 +80,7 @@ public void test01JsonRpcApiTestOfBuildTransactionForTransferTrx() throws Except @Test(enabled = true, description = "Json rpc api of buildTransaction for transfer trc10") public void test02JsonRpcApiTestOfBuildTransactionForTransferTrc10() throws Exception { + PublicMethed.waitProduceNextBlock(blockingStubFull); final Long beforeTokenBalance = PublicMethed.getAssetBalanceByAssetId(ByteString .copyFromUtf8(jsonRpcAssetId), receiverKey, blockingStubFull); JsonObject param = new JsonObject(); @@ -92,4 +107,15 @@ public void test02JsonRpcApiTestOfBuildTransactionForTransferTrc10() throws Exce } + /** + * constructor. + */ + @AfterClass + public void shutdown() throws InterruptedException { + if (channelFull != null) { + channelFull.shutdown().awaitTermination(5, TimeUnit.SECONDS); + } + } + + } diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/GetBlock001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/GetBlock001.java index aedae7d32cc..ee30990dd65 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/GetBlock001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/GetBlock001.java @@ -3,10 +3,15 @@ import com.alibaba.fastjson.JSONObject; import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import io.grpc.ManagedChannelBuilder; +import java.util.concurrent.TimeUnit; import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpResponse; import org.junit.Assert; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; +import org.tron.api.WalletGrpc; import org.tron.common.utils.ByteArray; import stest.tron.wallet.common.client.utils.HttpMethed; import stest.tron.wallet.common.client.utils.JsonRpcBase; @@ -18,6 +23,21 @@ public class GetBlock001 extends JsonRpcBase { private JSONObject responseContent; private HttpResponse response; + + /** + * constructor. + */ + @BeforeClass(enabled = true) + public void beforeClass() { + channelFull = ManagedChannelBuilder.forTarget(fullnode) + .usePlaintext(true) + .build(); + blockingStubFull = WalletGrpc.newBlockingStub(channelFull); + } + + + + @Test(enabled = true, description = "Json rpc api of eth_getBlockByHash") public void test01JsonRpcApiTestForEthGetBlockByHash() throws Exception { JsonArray params = new JsonArray(); @@ -35,4 +55,15 @@ public void test01JsonRpcApiTestForEthGetBlockByHash() throws Exception { .getJSONArray("transactions").size() >= 1); } + + /** + * constructor. + */ + @AfterClass + public void shutdown() throws InterruptedException { + if (channelFull != null) { + channelFull.shutdown().awaitTermination(5, TimeUnit.SECONDS); + } + } + } diff --git a/framework/src/test/java/stest/tron/wallet/onlinestress/TransactionCheck.java b/framework/src/test/java/stest/tron/wallet/onlinestress/TransactionCheck.java new file mode 100644 index 00000000000..c14e596e378 --- /dev/null +++ b/framework/src/test/java/stest/tron/wallet/onlinestress/TransactionCheck.java @@ -0,0 +1,52 @@ +package stest.tron.wallet.onlinestress; + +import com.google.protobuf.ByteString; +import org.testng.annotations.Test; +import org.tron.common.crypto.ECKey.ECDSASignature; +import org.tron.common.crypto.SignUtils; +import org.tron.common.parameter.CommonParameter; +import org.tron.common.utils.ByteArray; +import stest.tron.wallet.common.client.WalletClient; +import stest.tron.wallet.common.client.utils.Sha256Hash; + +public class TransactionCheck { + + @Test + public void hexToTransaction() throws Exception { + String targetHex1 = ""; + String targetHex2 = ""; + String hex = targetHex1; + org.tron.protos.Protocol.Transaction transaction = org.tron.protos.Protocol.Transaction + .parseFrom(ByteArray.fromHexString(hex)); + getBase64FromByteString(transaction.getSignature(0)); + String base64 = getBase64FromByteString(transaction.getSignature(0)); + byte[] address = SignUtils + .signatureToAddress((Sha256Hash + .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray())), base64, + CommonParameter.getInstance().isECKeyCryptoEngine()); + String addressStr = WalletClient.encode58Check(address); + String data = String.valueOf(transaction.getRawData().getData().toStringUtf8()); + System.out.println(addressStr); + System.out.println(data); + } + + + /** + * constructor. + */ + public static String getBase64FromByteString(ByteString sign) { + byte[] r = sign.substring(0, 32).toByteArray(); + byte[] s = sign.substring(32, 64).toByteArray(); + byte v = sign.byteAt(64); + if (v < 27) { + v += 27; //revId -> v + } + ECDSASignature signature = ECDSASignature.fromComponents(r, s, v); + return signature.toBase64(); + } + + + + +} diff --git a/framework/src/test/resources/testng.conf b/framework/src/test/resources/testng.conf index d938ca6bbb0..a45891de8ca 100644 --- a/framework/src/test/resources/testng.conf +++ b/framework/src/test/resources/testng.conf @@ -38,8 +38,8 @@ solidityNode = { "127.0.0.1:50071", #New beat 1 - #"39.106.145.222:50151", - #"39.106.145.222:50061", + "39.106.145.222:50061", + "39.106.145.222:50061", #"39.106.145.222:50071", #New beat 2 @@ -65,8 +65,8 @@ httpnode = { #New beta 2 - "101.200.46.37:50093", - "39.106.145.222:50093", + "101.200.46.37:50091", + "39.106.145.222:50091", "101.200.46.37:50192", "101.200.46.37:50094", "101.200.46.37:50082", @@ -88,6 +88,13 @@ jsonRpcNode = { ] } +ethHttpsNode = { + host.list = [ + "mainnet.infura.io", + #"47.95.206.44:50545", + ] +} + foundationAccount = { key1 = FC8BF0238748587B9617EB6D15D47A66C0E07C1A1959033CF249C6532DC29FE6 @@ -161,6 +168,7 @@ defaultParameter = { zenTokenFee = 10000000 zenTokenWhenCreateNewAddress = 1000000 zenTrc20TokenOwnerKey = ede941a01eb8234866f60c7e8e95db4614bb0d05298d82bae0abea81f1861046 + jsonRpcOwnerKey = dbc78781ad27f3751358333412d5edc85b13e5eee129a1a77f7232baadafae0e blackHoleAddress = THmtHi1Rzq4gSKYGEKv1DPkV7au6xU1AUB } From 5324fc7650efcd32c8f6b5f8a23f21cce43b8374 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 8 Sep 2021 16:06:53 +0800 Subject: [PATCH 224/341] feat: support deploy smart contract in estimatedGas --- .../core/services/jsonrpc/CallArguments.java | 11 +++++++++-- .../core/services/jsonrpc/TronJsonRpcImpl.java | 17 +++++++++++++++-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/CallArguments.java b/framework/src/main/java/org/tron/core/services/jsonrpc/CallArguments.java index dcb0dfe7d54..b7d8ae711d7 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/CallArguments.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/CallArguments.java @@ -30,15 +30,22 @@ public class CallArguments { public String nonce; // not used /** - * just support TransferContract and TriggerSmartContract + * just support TransferContract, CreateSmartContract and TriggerSmartContract * */ public ContractType getContractType(Wallet wallet) throws JsonRpcInvalidRequestException, JsonRpcInvalidParamsException { ContractType contractType; // from or to is null - if (paramStringIsNull(from) || paramStringIsNull(to)) { + if (paramStringIsNull(from)) { throw new JsonRpcInvalidRequestException("invalid json request"); + } else if (paramStringIsNull(to)) { + // data is null + if (paramStringIsNull(data)) { + throw new JsonRpcInvalidRequestException("invalid json request"); + } + + contractType = ContractType.CreateSmartContract; } else { byte[] contractAddressData = addressHashToByteArray(to); BytesMessage.Builder build = BytesMessage.newBuilder(); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 5d61db569d7..f6a38958a06 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -449,8 +449,16 @@ public String estimateGas(CallArguments args) throws JsonRpcInvalidRequestExcept Return.Builder retBuilder = Return.newBuilder(); try { + byte[] contractAddress; + + if (contractType == ContractType.TriggerSmartContract) { + contractAddress = addressHashToByteArray(args.to); + } else { + contractAddress = new byte[0]; + } + callTriggerConstantContract(ownerAddress, - addressHashToByteArray(args.to), + contractAddress, args.parseValue(), ByteArray.fromHexString(args.data), trxExtBuilder, @@ -458,7 +466,12 @@ public String estimateGas(CallArguments args) throws JsonRpcInvalidRequestExcept return ByteArray.toJsonHex(trxExtBuilder.getEnergyUsed()); } catch (ContractValidateException e) { - throw new JsonRpcInvalidRequestException(e.getMessage()); + String errString = "invalid contract"; + if (e.getMessage() != null) { + errString = e.getMessage(); + } + + throw new JsonRpcInvalidRequestException(errString); } catch (Exception e) { String errString = "invalid json request"; if (e.getMessage() != null) { From 28bee7bad9d5ac0af7b1aeae85bf4b55df1b609e Mon Sep 17 00:00:00 2001 From: sophiawang <1975054324@qq.com> Date: Wed, 8 Sep 2021 17:11:05 +0800 Subject: [PATCH 225/341] fix checkstyle and case --- .../newGrammar/NewFeatureForJavatron440.java | 67 +++++++++++-------- .../soliditycode/NewFeatureJavatron440.sol | 3 +- 2 files changed, 40 insertions(+), 30 deletions(-) diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/NewFeatureForJavatron440.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/NewFeatureForJavatron440.java index 773e13fa888..90dd33210fb 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/NewFeatureForJavatron440.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/NewFeatureForJavatron440.java @@ -2,6 +2,9 @@ import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; +import java.util.HashMap; +import java.util.Optional; +import java.util.concurrent.TimeUnit; import lombok.extern.slf4j.Slf4j; import org.junit.Assert; import org.testng.annotations.AfterClass; @@ -21,9 +24,6 @@ import stest.tron.wallet.common.client.utils.Base58; import stest.tron.wallet.common.client.utils.PublicMethed; -import java.util.HashMap; -import java.util.Optional; -import java.util.concurrent.TimeUnit; @Slf4j @@ -119,7 +119,7 @@ public void test01baseFee() { boolean flag = false; for (Integer i = 0; i < getChainParameters.get().getChainParameterCount(); i++) { key = getChainParameters.get().getChainParameter(i).getKey(); - if("getEnergyFee".equals(key)){ + if ("getEnergyFee".equals(key)) { energyfee = getChainParameters.get().getChainParameter(i).getValue(); logger.info("energyfee: " + energyfee); Assert.assertEquals(basefee, energyfee); @@ -145,9 +145,11 @@ public void test03BaseFeeFromCreate2() { String methedStr = "deploy(uint256)"; String argsStr = "1"; String txid = PublicMethed.triggerContract(contractD, methedStr, argsStr, - false,0,maxFeeLimit, contractExcAddress, contractExcKey, blockingStubFull); + false, 0, maxFeeLimit, contractExcAddress, + contractExcKey, blockingStubFull); PublicMethed.waitProduceNextBlock(blockingStubFull); - Optional info = PublicMethed.getTransactionInfoById(txid, blockingStubFull); + Optional info = + PublicMethed.getTransactionInfoById(txid, blockingStubFull); Assert.assertEquals(0, info.get().getResultValue()); Assert.assertEquals(Protocol.Transaction.Result.contractResult.SUCCESS, info.get().getReceipt().getResult()); @@ -163,7 +165,6 @@ public void test03BaseFeeFromCreate2() { .triggerConstantContractForExtention(create2Address, "baseFeeOnly()", "#", false, 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); -// System.out.println("111111111: " + transactionExtention.toString()); Assert.assertEquals(true, transactionExtention.getResult().getResult()); Assert.assertEquals("SUCESS", transactionExtention.getTransaction().getRet(0).getRet().toString()); @@ -178,7 +179,7 @@ public void test03BaseFeeFromCreate2() { boolean flag = false; for (Integer i = 0; i < getChainParameters.get().getChainParameterCount(); i++) { key = getChainParameters.get().getChainParameter(i).getKey(); - if("getEnergyFee".equals(key)){ + if ("getEnergyFee".equals(key)) { energyfee = getChainParameters.get().getChainParameter(i).getValue(); logger.info("energyfee: " + energyfee); Assert.assertEquals(basefee, energyfee); @@ -191,7 +192,6 @@ public void test03BaseFeeFromCreate2() { .triggerConstantContractForExtention(create2Address, "gasPriceOnly()", "#", false, 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); -// System.out.println("22222: " + transactionExtention.toString()); Assert.assertEquals(true, transactionExtention.getResult().getResult()); Assert.assertEquals("SUCESS", @@ -208,34 +208,35 @@ public void test04CallEnergy() { String transferToKey = ByteArray.toHexString(ecKey1.getPrivKeyBytes()); PublicMethed.printAddress(transferToKey); + Long temMaxLimitFee = 200000000L; String methedStr = "testCall(address,address)"; - String argsStr = "\"" + Base58.encode58Check(contractD) + "\"," + "\"" + Base58.encode58Check(transferToAddress) + "\""; + String argsStr = "\"" + Base58.encode58Check(contractD) + "\"," + "\"" + + Base58.encode58Check(transferToAddress) + "\""; String txid = PublicMethed.triggerContract(contractC, methedStr, argsStr, - false,0,maxFeeLimit, contractExcAddress, contractExcKey, blockingStubFull); + false, 0, temMaxLimitFee, contractExcAddress, contractExcKey, blockingStubFull); PublicMethed.waitProduceNextBlock(blockingStubFull); - Optional info = PublicMethed.getTransactionInfoById(txid, blockingStubFull); + Optional info = + PublicMethed.getTransactionInfoById(txid, blockingStubFull); System.out.println("0000000" + info.toString()); - Protocol.Account testAccount = PublicMethed.queryAccountByAddress(transferToAddress,blockingStubFull); + Protocol.Account testAccount = + PublicMethed.queryAccountByAddress(transferToAddress, blockingStubFull); System.out.println("testAccount: " + testAccount.toString()); - Assert.assertEquals(0, info.get().getResultValue()); - Assert.assertEquals(Protocol.Transaction.Result.contractResult.SUCCESS, + Assert.assertEquals(1, info.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.REVERT, info.get().getReceipt().getResult()); Assert.assertTrue(info.get().getInternalTransactions(0).getRejected()); - Assert.assertTrue(info.get().getReceipt().getEnergyFee() < maxFeeLimit); + Assert.assertTrue(info.get().getReceipt().getEnergyFee() < temMaxLimitFee); } @Test(enabled = true, description = "create2 address call can use 63/64 energy in new contract") public void test05Create2AddressCallEnergy() { - ECKey ecKey1 = new ECKey(Utils.getRandom()); - byte[] transferToAddress = ecKey1.getAddress(); - String transferToKey = ByteArray.toHexString(ecKey1.getPrivKeyBytes()); - PublicMethed.printAddress(transferToKey); String methedStr = "deploy(uint256)"; String argsStr = "1"; String txid = PublicMethed.triggerContract(contractD, methedStr, argsStr, - false,0,maxFeeLimit, contractExcAddress, contractExcKey, blockingStubFull); + false, 0, maxFeeLimit, contractExcAddress, contractExcKey, blockingStubFull); PublicMethed.waitProduceNextBlock(blockingStubFull); - Optional info = PublicMethed.getTransactionInfoById(txid, blockingStubFull); + Optional info = + PublicMethed.getTransactionInfoById(txid, blockingStubFull); Assert.assertEquals(0, info.get().getResultValue()); Assert.assertEquals(Protocol.Transaction.Result.contractResult.SUCCESS, info.get().getReceipt().getResult()); @@ -247,22 +248,30 @@ public void test05Create2AddressCallEnergy() { create2Address = ByteArray.fromHexString(create2Str); logger.info("create2Address: " + Base58.encode58Check(create2Address)); + ECKey ecKey1 = new ECKey(Utils.getRandom()); + byte[] transferToAddress = ecKey1.getAddress(); + String transferToKey = ByteArray.toHexString(ecKey1.getPrivKeyBytes()); + PublicMethed.printAddress(transferToKey); + + Long temMaxLimitFee = 200000000L; methedStr = "testCall(address,address)"; - argsStr = "\"" + Base58.encode58Check(contractD) + "\"," + "\"" + Base58.encode58Check(transferToAddress) + "\""; + argsStr = "\"" + Base58.encode58Check(contractD) + "\"," + "\"" + + Base58.encode58Check(transferToAddress) + "\""; txid = PublicMethed.triggerContract(create2Address, methedStr, argsStr, - false,0,maxFeeLimit, contractExcAddress, contractExcKey, blockingStubFull); + false, 0, temMaxLimitFee, contractExcAddress, contractExcKey, blockingStubFull); PublicMethed.waitProduceNextBlock(blockingStubFull); info = PublicMethed.getTransactionInfoById(txid, blockingStubFull); System.out.println("0000000" + info.toString()); - Protocol.Account testAccount = PublicMethed.queryAccountByAddress(transferToAddress,blockingStubFull); + Protocol.Account testAccount = + PublicMethed.queryAccountByAddress(transferToAddress, blockingStubFull); System.out.println("testAccount: " + testAccount.toString()); - Assert.assertEquals("",testAccount.toString()); - Assert.assertEquals(0, info.get().getResultValue()); - Assert.assertEquals(Protocol.Transaction.Result.contractResult.SUCCESS, + Assert.assertEquals("", testAccount.toString()); + Assert.assertEquals(1, info.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.REVERT, info.get().getReceipt().getResult()); Assert.assertTrue(info.get().getInternalTransactions(0).getRejected()); - Assert.assertTrue(info.get().getReceipt().getEnergyFee() < maxFeeLimit); + Assert.assertTrue(info.get().getReceipt().getEnergyFee() < temMaxLimitFee); } diff --git a/framework/src/test/resources/soliditycode/NewFeatureJavatron440.sol b/framework/src/test/resources/soliditycode/NewFeatureJavatron440.sol index 2416db39f32..ab560c42072 100644 --- a/framework/src/test/resources/soliditycode/NewFeatureJavatron440.sol +++ b/framework/src/test/resources/soliditycode/NewFeatureJavatron440.sol @@ -26,7 +26,8 @@ contract C { } function testCall(address payable caller, address payable transferTo) public { - caller.call(abi.encodeWithSignature("transfer(address)",transferTo)); + (bool success, bytes memory data) = caller.call(abi.encodeWithSignature("transfer(address)",transferTo)); + require(success); } } From 0b43276667c97d1fc233a4f8051c264b91ec12af Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 9 Sep 2021 12:18:14 +0800 Subject: [PATCH 226/341] feat: use JsonRpcInvalidRequestException instead of JsonRpcInternalException in estimateGas --- .../java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index f6a38958a06..a49878f7770 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -478,7 +478,7 @@ public String estimateGas(CallArguments args) throws JsonRpcInvalidRequestExcept errString = e.getMessage().replaceAll("[\"]", "\'"); } - throw new JsonRpcInternalException(errString); + throw new JsonRpcInvalidRequestException(errString); } } From 59f412f3125f0e29a544db88190293de5b20bd80 Mon Sep 17 00:00:00 2001 From: liukai Date: Thu, 9 Sep 2021 15:13:35 +0800 Subject: [PATCH 227/341] modify shell upgrade --- shell.md | 2 +- start.sh | 75 +++++++++++++++++++++++++++++++++++++++----------------- 2 files changed, 54 insertions(+), 23 deletions(-) diff --git a/shell.md b/shell.md index cc32c94e89b..0b5b6e3dafd 100644 --- a/shell.md +++ b/shell.md @@ -191,7 +191,7 @@ After using this command, the FullNode directory will be created and the compile ``` ├── ... ├── FullNode/ - ├── config.conf + ├── config.conf ├── FullNode.jar ├── start.sh ``` diff --git a/start.sh b/start.sh index b9697b750a9..26e02d0ae64 100644 --- a/start.sh +++ b/start.sh @@ -31,6 +31,7 @@ REBUILD_BATCH_SIZE=80000 DOWNLOAD=false RELEASE_URL='https://github.com/tronprotocol/java-tron/releases' QUICK_START=false +CLONE_BUILD=false getLatestReleaseVersion() { default_version='GreatVoyage-v4.3.0' @@ -85,14 +86,13 @@ download() { mkdirFullNode() { if [ ! -d $FULL_NODE_DIR ]; then - echo "info: mkdir $FULL_NODE_DIR" + echo "info: create $FULL_NODE_DIR" mkdir $FULL_NODE_DIR $(cp $0 $FULL_NODE_DIR) cd $FULL_NODE_DIR elif [ -d $FULL_NODE_DIR ]; then cd $FULL_NODE_DIR fi - } quickStart() { @@ -105,6 +105,7 @@ quickStart() { echo "info: download $full_node_version" download $RELEASE_URL/download/$full_node_version/$JAR_NAME $JAR_NAME + checkSign } cloneCode() { @@ -119,12 +120,20 @@ cloneCode() { } cloneBuild() { + local currentPwd=$PWD + echo 'info: clone java-tron' cloneCode - echo "info: build java-tron" - sh 'java-tron/'gradlew clean build -x test - mkdirFullNode + + echo 'info: build java-tron' + cd java-tron + sh gradlew clean build -x test if [[ $? == 0 ]];then - cp 'java-tron/build/libs/FullNode.jar' 'FullNode/' + cd $currentPwd + mkdirFullNode + cp '../java-tron/build/libs/FullNode.jar' $PWD + cp '../java-tron/framework/src/main/resources/config.conf' $PWD + else + exit fi } @@ -158,7 +167,6 @@ stopService() { checkAllowMemory() { os=`uname` -# totalMemory=`getTotalMemory` totalMemory=$(`echo getTotalMemory`) total=`expr $totalMemory / 1024` if [[ $os == 'Darwin' ]]; then @@ -272,6 +280,31 @@ rebuildManifest() { fi } +checkSign() { + echo 'info: verify signature' + local latest_version=$(`echo getLatestReleaseVersion`) + download $RELEASE_URL/download/$latest_version/sha256sum.txt sha256sum.txt + fullNodeSha256=$(cat sha256sum.txt|grep 'FullNode'| awk -F ' ' '{print $1}') + + os=`uname` + if [[ $os == 'Linux' ]] || [[ $os == 'linux' ]] ; then + releaseFullNodeSha256=$(sha256sum FullNode.jar| grep FullNode | awk -F ' ' '{print $1}') + elif [[ $os == 'Darwin' ]]; then + releaseFullNodeSha256=$(shasum -a 256 FullNode.jar| grep FullNode | awk -F ' ' '{print $1}') + cat $releaseFullNodeSha256 | awk -F ' ' '{print $0}' + fi + + echo "info: release sha256sum sign: $releaseFullNodeSha256" + echo "info: FullNode.jar sha256sum sign: $fullNodeSha256" + + if [[ "$fullNodeSha256" == "$releaseFullNodeSha256" ]]; then + echo 'info: sha256 signatures pass' + else + echo 'info: sha256 signature exception!!!' + echo 'info: please compile from the code or download the latest version from https://github.com/tronprotocol/java-tron' + fi +} + restart() { stopService checkAllowMemory @@ -281,13 +314,6 @@ restart() { startService } -//加校验 - -//3个例子 -1.本地起 -2.拉代码 -3.拉release - 加验验 while [ -n "$1" ]; do case "$1" in -c) @@ -317,7 +343,7 @@ while [ -n "$1" ]; do shift 2 ;; -cb) - cloneBuild + CLONE_BUILD=true shift 1 ;; --download) @@ -367,6 +393,10 @@ while [ -n "$1" ]; do esac done +if [[ $CLONE_BUILD == true ]];then + cloneBuild +fi + if [[ $QUICK_START == true ]]; then quickStart if [[ $? == 0 ]] ; then @@ -381,12 +411,6 @@ fi if [[ $UPGRADE == true ]]; then upgrade - exit -fi - -if [[ $RUN == true ]]; then - restart - exit fi if [[ $DOWNLOAD == true ]]; then @@ -395,4 +419,11 @@ if [[ $DOWNLOAD == true ]]; then exit fi -restart \ No newline at end of file +if [[ $RUN == true ]]; then + restart + exit +fi + +if [[ $# -eq 0 ]]; then + restart +fi \ No newline at end of file From fe719adac57640cfbbbb611b23aed337900c3ac4 Mon Sep 17 00:00:00 2001 From: sophiawang <1975054324@qq.com> Date: Thu, 9 Sep 2021 15:47:29 +0800 Subject: [PATCH 228/341] fix case to adapt java-tron v4.4.0(call can use 63/64 left energy) --- .../tvmnewcommand/create2/Create2Test003.java | 2 +- .../tvmnewcommand/create2/Create2Test014.java | 2 +- .../tvmnewcommand/create2/Create2Test020.java | 15 ++++++----- .../tvmnewcommand/create2/Create2Test024.java | 2 +- .../zenProofCommand/pedersenHash001.java | 25 ++++++++++--------- .../resources/soliditycode/Create2Test024.sol | 2 +- 6 files changed, 26 insertions(+), 22 deletions(-) diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/create2/Create2Test003.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/create2/Create2Test003.java index cfff3570bc3..636bdacd4e8 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/create2/Create2Test003.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/create2/Create2Test003.java @@ -195,7 +195,7 @@ public void test02TriggerCreate2WithInvalidBytecode() { Assert.assertEquals(1, infoById.get().getResultValue()); Assert .assertThat(infoById.get().getResMessage().toStringUtf8(), - containsString("Not enough energy for 'SWAP1' operation executing")); + containsString("REVERT opcode executed")); } @Test(enabled = true, description = "Trigger create2 command with empty bytecode") diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/create2/Create2Test014.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/create2/Create2Test014.java index 164bb833da3..a7d270992b5 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/create2/Create2Test014.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/create2/Create2Test014.java @@ -329,7 +329,7 @@ public void test02TriggerCreate2ToDeployTestContractAgain() { Assert.assertEquals(1, infoById.get().getResultValue()); Assert .assertThat(infoById.get().getResMessage().toStringUtf8(), - containsString("Not enough energy for 'SWAP1' operation executing")); + containsString("REVERT opcode executed")); } // Istanbul change create2 algorithm diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/create2/Create2Test020.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/create2/Create2Test020.java index 8e58e3def0b..3637d1f4814 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/create2/Create2Test020.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/create2/Create2Test020.java @@ -516,7 +516,8 @@ public void testTriggerContract3() { } - @Test(enabled = true, description = "TriggerContract a constant function created by create2") + @Test(enabled = true, description = "TriggerContract a constant function created by create2" + + "can not create2 twice if salt type is string") public void testTriggerContract4() { Account info; AccountResourceMessage resourceInfo = PublicMethed.getAccountResource(contractExcAddress, @@ -630,11 +631,12 @@ public void testTriggerContract4() { Assert .assertThat(ByteArray .toStr(infoById2.get().getResMessage().toByteArray()), - containsString("Not enough energy")); + containsString("REVERT opcode executed")); } - @Test(enabled = true, description = "TriggerContract a constant function created by create2") + @Test(enabled = true, description = "TriggerContract a constant function created by create2" + + "can not create2 twice if salt type is string") public void testTriggerContract5() { Account info; @@ -750,11 +752,12 @@ public void testTriggerContract5() { Assert .assertThat(ByteArray .toStr(infoById2.get().getResMessage().toByteArray()), - containsString("Not enough energy")); + containsString("REVERT opcode executed")); } - @Test(enabled = true, description = "TriggerContract a constant function created by create2") + @Test(enabled = true, description = "TriggerContract a constant function created by create2" + + "can not create2 twice if salt type is string") public void testTriggerContract6() { Account info; @@ -872,7 +875,7 @@ public void testTriggerContract6() { Assert .assertThat(ByteArray .toStr(infoById2.get().getResMessage().toByteArray()), - containsString("Not enough energy")); + containsString("REVERT opcode executed")); } /** diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/create2/Create2Test024.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/create2/Create2Test024.java index bc9b4ba5f78..1f3898d153d 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/create2/Create2Test024.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/create2/Create2Test024.java @@ -258,7 +258,7 @@ public void test02TriggerTestContract() { Assert.assertEquals(infoById.get().getResultValue(), 1); Assert.assertEquals(infoById.get().getResult().toString(), "FAILED"); Assert.assertThat(ByteArray.toStr(infoById.get().getResMessage().toByteArray()), - containsString("Not enough energy for 'SWAP1' operation executing: ")); + containsString("REVERT opcode executed")); } diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/zenProofCommand/pedersenHash001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/zenProofCommand/pedersenHash001.java index 74f1c0bd833..9ea86709e2e 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/zenProofCommand/pedersenHash001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/zenProofCommand/pedersenHash001.java @@ -86,12 +86,14 @@ public void test01DataIsEmpty() { PublicMethed.waitProduceNextBlock(blockingStubFull); Optional infoById = PublicMethed .getTransactionInfoById(txid, blockingStubFull); - Assert.assertEquals(1, infoById.get().getResultValue()); - Assert.assertEquals("FAILED", infoById.get().getResult().toString()); - Assert.assertEquals("OUT_OF_ENERGY", infoById.get().getReceipt().getResult().toString()); - Assert.assertEquals(1000000000, infoById.get().getFee()); - Assert.assertTrue(infoById.get().getResMessage().toStringUtf8() - .contains("Not enough energy for 'SWAP2' operation executing: curInvokeEnergyLimit")); + Assert.assertEquals(0, infoById.get().getResultValue()); + Assert.assertEquals("SUCESS", infoById.get().getResult().toString()); + byte[] result = infoById.get().getContractResult(0).toByteArray(); + String boolResult = ByteArray.toHexString(ByteArray.subArray(result, 0, 32)); + System.out.println("boolResult: " + boolResult); + Assert.assertEquals("0000000000000000000000000000000000000000000000000000000000000000", + boolResult); + } @Test(enabled = true, description = "data length limit") @@ -106,12 +108,11 @@ public void test02DataLengthLimit() { PublicMethed.waitProduceNextBlock(blockingStubFull); infoById = PublicMethed .getTransactionInfoById(txid, blockingStubFull); - Assert.assertEquals(1, infoById.get().getResultValue()); - Assert.assertEquals("FAILED", infoById.get().getResult().toString()); - Assert.assertEquals("OUT_OF_ENERGY", infoById.get().getReceipt().getResult().toString()); - Assert.assertEquals(1000000000, infoById.get().getFee()); - Assert.assertTrue(infoById.get().getResMessage().toStringUtf8() - .contains("Not enough energy for 'SWAP2' operation executing: curInvokeEnergyLimit")); + Assert.assertEquals(0, infoById.get().getResultValue()); + Assert.assertEquals("SUCESS", infoById.get().getResult().toString()); + int boolResult = ByteArray.toInt(infoById.get().getContractResult(0).toByteArray()); + Assert.assertFalse(Boolean.valueOf(String.valueOf(boolResult))); + Assert.assertTrue(maxFeeLimit > infoById.get().getFee()); // length:128 String argsStr2 = "\"0000000000000000000000000000000000000000000000000000000000000001" diff --git a/framework/src/test/resources/soliditycode/Create2Test024.sol b/framework/src/test/resources/soliditycode/Create2Test024.sol index 3e55e1cf0fc..5d43c0f4ab2 100644 --- a/framework/src/test/resources/soliditycode/Create2Test024.sol +++ b/framework/src/test/resources/soliditycode/Create2Test024.sol @@ -31,7 +31,7 @@ contract Factory { assembly { addr1 := create2(0, add(code, 0x20), mload(code), salt) - if iszero(extcodesize(addr)) { + if iszero(extcodesize(addr1)) { revert(0, 0) } } From 6c49e4551b4a7432bf6292efd8fad0a8bc73e51f Mon Sep 17 00:00:00 2001 From: liukai Date: Thu, 9 Sep 2021 17:03:36 +0800 Subject: [PATCH 229/341] modify: optimize shell.md --- README.md | 5 +--- shell.md | 87 +++++++++++++++++++++++-------------------------------- 2 files changed, 38 insertions(+), 54 deletions(-) diff --git a/README.md b/README.md index 8b36b529880..27c8c209127 100644 --- a/README.md +++ b/README.md @@ -96,7 +96,4 @@ If you'd like to contribute to java-tron, please read the following instructions * [White Paper](https://tron.network/resources?lng=&name=1) White paper of TRON network. # License -java-tron is released under the [LGPLv3 license](https://github.com/tronprotocol/java-tron/blob/master/LICENSE). - - -脚本贴到这里 \ No newline at end of file +java-tron is released under the [LGPLv3 license](https://github.com/tronprotocol/java-tron/blob/master/LICENSE). \ No newline at end of file diff --git a/shell.md b/shell.md index 0b5b6e3dafd..dd97b410fef 100644 --- a/shell.md +++ b/shell.md @@ -71,16 +71,17 @@ If you have already downloaded `java-tron`, you can use `start.sh` to run `java- ### How to use * Local mode + + Operate local server start and stop + * Online mode + Get the latest code and latest release from github + #### 1.local mode Format: -``` -sh start.sh [option] -``` - ``` sh start.sh [-j ] [-d ] [-c ] [[--run] | [--stop]] ``` @@ -112,13 +113,13 @@ sh start.sh --stop Format: ``` -sh start.sh --release [option] +sh start.sh --release [--run] ``` -Download the latest version of java-tron, demo: +Get the latest version up and running, demo: ``` -sh start.sh --release +sh start.sh --release --run ``` contains the following files: @@ -126,78 +127,64 @@ contains the following files: ``` ├── ... ├── FullNode/ - ├── config.conf - ├── FullNode.jar - ├── start.sh -``` - -Get the latest version up and running, demo: - -``` -sh start.sh --release --run + ├── config.conf + ├── FullNode.jar + ├── start.sh ``` **clone code and build** Get the latest code from master branch of https://github.com/tronprotocol/java-tron and compile download the latest release. +After using this command, the FullNode directory will be created and the compiled file FullNode.jar and related configuration files will be copied to this directory + Format: ``` -sh start.sh -cb [option] +sh start.sh -cb [--run] ``` demo: ``` -sh start.sh -cb +sh start.sh -cb --run ``` contains the following files: ``` ├── ... -├── java-tron/ - ├── actuator/ - ├── chainbase/ - ├── common/ - ├── config/ - ├── consensus/ - ├── crypto/ - ├── docker/ - ├── docs/ - ├── example/ - ├── framework/ - ├── gradle/ - ├── plugins/ - ├── protocol/ - ├── config.conf - ├── FullNode.jar - ├── start.sh - ├── README.md - ├── ... -``` - -Download the code and compile and run it - -demo: - -``` -sh start.sh -cb --run +├── java-tron + ├── actuator/ + ├── chainbase/ + ├── common/ + ├── config/ + ├── consensus/ + ├── crypto/ + ├── docker/ + ├── docs/ + ├── example/ + ├── framework/ + ├── gradle/ + ├── plugins/ + ├── protocol/ + ├── config.conf + ├── FullNode.jar + ├── start.sh + ├── README.md + ├── ... ``` -After using this command, the FullNode directory will be created and the compiled file FullNode.jar and related configuration files will be copied to this directory + ``` -├── ... +├── java-tron/ ├── FullNode/ - ├── config.conf + |── config.conf ├── FullNode.jar ├── start.sh ``` - - #### 3.rebuild manifest This tool provides the ability to reformat the manifest according to the current database. From 5418305afb1523bb374aa8fca1e178080d8bf1ea Mon Sep 17 00:00:00 2001 From: liukai Date: Thu, 9 Sep 2021 18:49:54 +0800 Subject: [PATCH 230/341] modify shell.md --- shell.md | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/shell.md b/shell.md index dd97b410fef..69dcdd6846d 100644 --- a/shell.md +++ b/shell.md @@ -63,7 +63,7 @@ If you have already downloaded `java-tron`, you can use `start.sh` to run `java- specify the batch manifest size,default:80000 -* `-dr` or `--disable-rewrite-manifes` +* `-dr` or `--disable-rewrite-manifes` disable rewrite manifes *** @@ -72,11 +72,11 @@ If you have already downloaded `java-tron`, you can use `start.sh` to run `java- * Local mode - Operate local server start and stop + Start the service using the native Jar package * Online mode - Get the latest code and latest release from github + Get the latest code or latest release from github and start the service #### 1.local mode @@ -88,12 +88,6 @@ sh start.sh [-j ] [-d ] [-c ] [[--ru **start service** -``` -sh start.sh -``` - -or - ``` sh start.sh --run ``` @@ -192,15 +186,19 @@ This tool provides the ability to reformat the manifest according to the current Format: ``` -sh start.sh [-m ] | [-b ] | [-d ] +sh start.sh <--run | --release | -cb> [-m ] | [-b ] | [-d | [-dr | --disable-rewrite-manifes]] ``` -Demo - +Demo +1.local mode: ``` -sh start.sh -d /tmp/db/database -m 128 -b 64000 +sh start.sh --run -d /tmp/db/database -m 128 -b 64000 ``` +2.Online mode +``` +sh start.sh --release --run -d /tmp/db/database -m 128 -b 64000 +``` For more design details, please refer to: [TIP298](https://github.com/tronprotocol/tips/issues/298) | [Leveldb Startup Optimization Plugins](https://github.com/tronprotocol/documentation-en/blob/master/docs/developers/archive-manifest.md) From 9a04ef020a1c43b851156b20c32da75e3b6b61fe Mon Sep 17 00:00:00 2001 From: liukai Date: Thu, 9 Sep 2021 18:50:38 +0800 Subject: [PATCH 231/341] modify shell.md --- shell.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shell.md b/shell.md index 69dcdd6846d..5fdc2423586 100644 --- a/shell.md +++ b/shell.md @@ -63,8 +63,8 @@ If you have already downloaded `java-tron`, you can use `start.sh` to run `java- specify the batch manifest size,default:80000 -* `-dr` or `--disable-rewrite-manifes` - disable rewrite manifes +* `-dr` or `--disable-rewrite-manifest` + disable rewrite manifest *** From 5fc1df7b27515396dd2f51d27d66412b70337a12 Mon Sep 17 00:00:00 2001 From: liukai Date: Thu, 9 Sep 2021 19:02:24 +0800 Subject: [PATCH 232/341] modify rebuild manifest tool --- shell.md | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/shell.md b/shell.md index 5fdc2423586..fb3188cb63d 100644 --- a/shell.md +++ b/shell.md @@ -101,16 +101,18 @@ sh start.sh --stop #### 2.online mode - +* Get the latest release +* Clone code and build **Get the latest release** Format: ``` -sh start.sh --release [--run] +sh start.sh <--run | --release | -cb> [-m ] | [-b ] | [-d | [-dr | --disable-rewrite-manifes]] ``` -Get the latest version up and running, demo: +Get the latest version up and running +demo: ``` sh start.sh --release --run @@ -169,8 +171,6 @@ contains the following files: ├── ... ``` - - ``` ├── java-tron/ ├── FullNode/ @@ -179,15 +179,9 @@ contains the following files: ├── start.sh ``` -#### 3.rebuild manifest - -This tool provides the ability to reformat the manifest according to the current database. +#### 3.rebuild manifest tool -Format: - -``` -sh start.sh <--run | --release | -cb> [-m ] | [-b ] | [-d | [-dr | --disable-rewrite-manifes]] -``` +This tool provides the ability to reformat the manifest according to the current database,Enabled by default. Demo 1.local mode: From e0af11fc8abba91cbfa410c8b7f2cb421503f545 Mon Sep 17 00:00:00 2001 From: daxinzang1 <280474930@qq.com> Date: Fri, 10 Sep 2021 17:24:08 +0800 Subject: [PATCH 233/341] Add jsonprc base depand --- .../wallet/common/client/utils/JsonRpcBase.java | 13 +++++++++++++ .../resources/soliditycode/contractTrcToken001.sol | 11 +++++++++++ 2 files changed, 24 insertions(+) diff --git a/framework/src/test/java/stest/tron/wallet/common/client/utils/JsonRpcBase.java b/framework/src/test/java/stest/tron/wallet/common/client/utils/JsonRpcBase.java index 4190096a690..d1fe6b1e4e9 100644 --- a/framework/src/test/java/stest/tron/wallet/common/client/utils/JsonRpcBase.java +++ b/framework/src/test/java/stest/tron/wallet/common/client/utils/JsonRpcBase.java @@ -101,6 +101,7 @@ public class JsonRpcBase { public static String blockNumHex; public static String blockId; public static String txid; + public static String trc20Txid; /** @@ -289,6 +290,18 @@ public void deployTrc20Contract() { trc20AddressHex = ByteArray.toHexString(infoById.get().getContractAddress().toByteArray()); + byte[] trc20Address = infoById.get().getContractAddress().toByteArray(); + + String selector = "transfer(address,uint256)"; + String addressParam = "000000000000000000000000" + ByteArray + .toHexString(foundationAccountAddress).substring(2);//[0,3) + String transferValueParam = "0000000000000000000000000000000000000000000000000000000000000001"; + String paramString = addressParam + transferValueParam; + + trc20Txid = PublicMethed.triggerContract(trc20Address, selector, paramString, + true, 0, maxFeeLimit, "0",0, + jsonRpcOwnerAddress, jsonRpcOwnerKey, blockingStubFull); + } /** diff --git a/framework/src/test/resources/soliditycode/contractTrcToken001.sol b/framework/src/test/resources/soliditycode/contractTrcToken001.sol index ea28f4a62b6..4bd83e30229 100644 --- a/framework/src/test/resources/soliditycode/contractTrcToken001.sol +++ b/framework/src/test/resources/soliditycode/contractTrcToken001.sol @@ -1,6 +1,9 @@ contract tokenTest{ + + uint pos0; + mapping(address => uint) pos1; trcToken idCon = 0; uint256 tokenValueCon=0; uint256 callValueCon = 0; @@ -22,9 +25,17 @@ idCon = msg.tokenid; tokenValueCon = msg.tokenvalue; callValueCon = msg.value; + Storage(); } function getResultInCon() public payable returns(trcToken, uint256, uint256) { return (idCon, tokenValueCon, callValueCon); } + + + function Storage() public { + pos0 = 1234; + pos1[msg.sender] = 5678; + } + } \ No newline at end of file From 3710bb597dd079f21b31e281fdfbbfdbbf94bd82 Mon Sep 17 00:00:00 2001 From: sophiawang <1975054324@qq.com> Date: Mon, 13 Sep 2021 11:11:16 +0800 Subject: [PATCH 234/341] ignore unit test --- .../java/org/tron/core/db/EnergyPriceHistoryLoaderTest.java | 2 ++ framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java | 2 ++ .../test/java/org/tron/core/services/ProposalServiceTest.java | 3 +++ 3 files changed, 7 insertions(+) diff --git a/framework/src/test/java/org/tron/core/db/EnergyPriceHistoryLoaderTest.java b/framework/src/test/java/org/tron/core/db/EnergyPriceHistoryLoaderTest.java index 29759c915ef..813b3159712 100644 --- a/framework/src/test/java/org/tron/core/db/EnergyPriceHistoryLoaderTest.java +++ b/framework/src/test/java/org/tron/core/db/EnergyPriceHistoryLoaderTest.java @@ -15,6 +15,7 @@ import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; +import org.junit.Ignore; import org.junit.Test; import org.tron.common.application.TronApplicationContext; import org.tron.common.utils.FileUtil; @@ -28,6 +29,7 @@ import org.tron.protos.Protocol.Proposal; import org.tron.protos.Protocol.Proposal.State; +@Ignore @Slf4j public class EnergyPriceHistoryLoaderTest { diff --git a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java index e08a138bb89..878a4b6a6c0 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java @@ -5,6 +5,7 @@ import org.bouncycastle.util.encoders.Hex; import org.junit.Assert; +import org.junit.Ignore; import org.junit.Test; import org.tron.common.crypto.Hash; import org.tron.common.runtime.vm.DataWord; @@ -13,6 +14,7 @@ import org.tron.common.utils.Commons; import org.tron.core.services.jsonrpc.CallArguments; +@Ignore public class JsonRpcTest { public void generateCallParameterWIthMethodAndParam() { diff --git a/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java b/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java index 4e5d420535c..8a01a2f8225 100644 --- a/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java +++ b/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java @@ -9,7 +9,9 @@ import org.junit.After; import org.junit.Assert; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; + import org.tron.common.application.TronApplicationContext; import org.tron.common.utils.FileUtil; import org.tron.core.Constant; @@ -21,6 +23,7 @@ import org.tron.core.utils.ProposalUtil.ProposalType; import org.tron.protos.Protocol.Proposal; +@Ignore public class ProposalServiceTest { private TronApplicationContext context; From fc84e21b9a75350abeb740158a34615ff8d57600 Mon Sep 17 00:00:00 2001 From: liukai Date: Mon, 13 Sep 2021 12:18:44 +0800 Subject: [PATCH 235/341] optimize md and start.sh --- shell.md | 16 ++++------------ start.sh | 39 +++++++++++++++++++++++---------------- 2 files changed, 27 insertions(+), 28 deletions(-) diff --git a/shell.md b/shell.md index fb3188cb63d..56ca0c7bc2f 100644 --- a/shell.md +++ b/shell.md @@ -1,3 +1,4 @@ + ## Quick Start Scripting Tool ## Introduction @@ -108,7 +109,7 @@ sh start.sh --stop Format: ``` -sh start.sh <--run | --release | -cb> [-m ] | [-b ] | [-d | [-dr | --disable-rewrite-manifes]] +sh start.sh <[--release | -cb]> <--run> [-m ] | [-b ] | [-d | [-dr | --disable-rewrite-manifes]] ``` Get the latest version up and running @@ -134,12 +135,6 @@ Get the latest code from master branch of https://github.com/tronprotocol/java-t After using this command, the FullNode directory will be created and the compiled file FullNode.jar and related configuration files will be copied to this directory -Format: - -``` -sh start.sh -cb [--run] -``` - demo: ``` @@ -190,11 +185,8 @@ sh start.sh --run -d /tmp/db/database -m 128 -b 64000 ``` 2.Online mode + ``` sh start.sh --release --run -d /tmp/db/database -m 128 -b 64000 ``` -For more design details, please refer to: [TIP298](https://github.com/tronprotocol/tips/issues/298) | [Leveldb Startup Optimization Plugins](https://github.com/tronprotocol/documentation-en/blob/master/docs/developers/archive-manifest.md) - - - - +For more design details, please refer to: [TIP298](https://github.com/tronprotocol/tips/issues/298) | [Leveldb Startup Optimization Plugins](https://github.com/tronprotocol/documentation-en/blob/master/docs/developers/archive-manifest.md) \ No newline at end of file diff --git a/start.sh b/start.sh index 26e02d0ae64..2c3d395442b 100644 --- a/start.sh +++ b/start.sh @@ -34,12 +34,11 @@ QUICK_START=false CLONE_BUILD=false getLatestReleaseVersion() { - default_version='GreatVoyage-v4.3.0' full_node_version=`git ls-remote --tags git@github.com:tronprotocol/java-tron.git |grep GreatVoyage- | awk -F '/' 'END{print $3}'` if [[ -n $full_node_version ]]; then echo $full_node_version else - echo $default_version + echo '' fi } @@ -48,8 +47,8 @@ checkVersion() { if [[ -n $github_release_version ]]; then echo "info: github latest version: $github_release_version" echo $github_release_version - else - echo '' + else + echo 'info: not getting the latest version' fi } @@ -96,16 +95,20 @@ mkdirFullNode() { } quickStart() { - mkdirFullNode - full_node_version=$(`echo getLatestReleaseVersion`) - echo "info: check latest version: $full_node_version" - echo 'info: download config' - download https://raw.githubusercontent.com/tronprotocol/tron-deployment/$GITHUB_BRANCH/$FULL_NODE_CONFIG $FULL_NODE_CONFIG - mv $FULL_NODE_CONFIG 'config.conf' - - echo "info: download $full_node_version" - download $RELEASE_URL/download/$full_node_version/$JAR_NAME $JAR_NAME - checkSign + if [[ -n $github_release_version ]]; then + mkdirFullNode + full_node_version=$(`echo getLatestReleaseVersion`) + echo "info: check latest version: $full_node_version" + echo 'info: download config' + download https://raw.githubusercontent.com/tronprotocol/tron-deployment/$GITHUB_BRANCH/$FULL_NODE_CONFIG $FULL_NODE_CONFIG + mv $FULL_NODE_CONFIG 'config.conf' + + echo "info: download $full_node_version" + download $RELEASE_URL/download/$full_node_version/$JAR_NAME $JAR_NAME + checkSign + else + echo 'info: not getting the latest version' + fi } cloneCode() { @@ -415,8 +418,12 @@ fi if [[ $DOWNLOAD == true ]]; then latest=$(`echo getLatestReleaseVersion`) - download $RELEASE_URL/download/$latest/$JAR_NAME $latest - exit + if [[ -n $latest ]]; then + download $RELEASE_URL/download/$latest/$JAR_NAME $latest + exit + else + echo 'info: not getting the latest version' + fi fi if [[ $RUN == true ]]; then From 091b54b882336c1e9afe2aabde095a165a07b391 Mon Sep 17 00:00:00 2001 From: liukai Date: Mon, 13 Sep 2021 14:13:45 +0800 Subject: [PATCH 236/341] modify change getLatestReleaseVersion exit type --- start.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/start.sh b/start.sh index 2c3d395442b..f87c17bcb02 100644 --- a/start.sh +++ b/start.sh @@ -49,6 +49,7 @@ checkVersion() { echo $github_release_version else echo 'info: not getting the latest version' + exit fi } @@ -108,6 +109,7 @@ quickStart() { checkSign else echo 'info: not getting the latest version' + exit fi } From 4d96cd1d7fd3d89d88f2b08a7b748153bd51527b Mon Sep 17 00:00:00 2001 From: liukai Date: Mon, 13 Sep 2021 14:16:46 +0800 Subject: [PATCH 237/341] modify change getLatestReleaseVersion exit type --- shell.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/shell.md b/shell.md index 56ca0c7bc2f..c84e725d27d 100644 --- a/shell.md +++ b/shell.md @@ -3,9 +3,9 @@ ## Introduction -Using the `start.sh` script, you can quickly and easily build projects. +Using the `start.sh` script, you can quickly and easily run and build projects. -If you have already downloaded `java-tron`, you can use `start.sh` to run `java-tron`, or if you have not downloaded java-tron code or jar packages, you can use `start.sh` to download, compile, or get the latest release version in the form of a `jar package`. +If you have already downloaded `java-tron`, you can use `start.sh` to run `java-tron`, or if you have not downloaded java-tron code or jar packages, you can use `start.sh` to download, compile, run or get the latest release version in the form of a `jar package ` and run. *** @@ -184,7 +184,7 @@ Demo sh start.sh --run -d /tmp/db/database -m 128 -b 64000 ``` -2.Online mode +2.Online mode ``` sh start.sh --release --run -d /tmp/db/database -m 128 -b 64000 From c60dd1976a66242e903f8972772f2ac1bb20105e Mon Sep 17 00:00:00 2001 From: liukai Date: Mon, 13 Sep 2021 14:18:37 +0800 Subject: [PATCH 238/341] modify format --- .../src/main/java/org/tron/core/db2/core/SnapshotImpl.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotImpl.java b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotImpl.java index d71c97ccf73..08cb8fd6745 100644 --- a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotImpl.java +++ b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotImpl.java @@ -21,6 +21,8 @@ public class SnapshotImpl extends AbstractSnapshot { @Getter protected Snapshot root; + + SnapshotImpl(Snapshot snapshot) { root = snapshot.getRoot(); synchronized (this) { From 8b9658eeb27a333543c08ce245558d8707d459c0 Mon Sep 17 00:00:00 2001 From: liukai Date: Mon, 13 Sep 2021 14:19:08 +0800 Subject: [PATCH 239/341] modify format --- .../src/main/java/org/tron/core/db2/core/SnapshotImpl.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotImpl.java b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotImpl.java index 08cb8fd6745..d71c97ccf73 100644 --- a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotImpl.java +++ b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotImpl.java @@ -21,8 +21,6 @@ public class SnapshotImpl extends AbstractSnapshot { @Getter protected Snapshot root; - - SnapshotImpl(Snapshot snapshot) { root = snapshot.getRoot(); synchronized (this) { From 889d2e5b12179cce7d4dad24271bdfe184291a80 Mon Sep 17 00:00:00 2001 From: liukai Date: Mon, 13 Sep 2021 14:19:30 +0800 Subject: [PATCH 240/341] modify format --- shell.md | 1 + 1 file changed, 1 insertion(+) diff --git a/shell.md b/shell.md index c84e725d27d..5d5bc62a612 100644 --- a/shell.md +++ b/shell.md @@ -104,6 +104,7 @@ sh start.sh --stop #### 2.online mode * Get the latest release * Clone code and build + **Get the latest release** Format: From cfcd6dff92a1d79321f509bd6e595250240aaa8b Mon Sep 17 00:00:00 2001 From: daxinzang1 <280474930@qq.com> Date: Mon, 13 Sep 2021 14:23:12 +0800 Subject: [PATCH 241/341] Add jsonrpc test case --- .../common/client/utils/HttpMethed.java | 18 + .../common/client/utils/JsonRpcBase.java | 3 +- .../dailybuild/jsonrpc/Accounts001.java | 435 +++++++++++++++--- 3 files changed, 384 insertions(+), 72 deletions(-) diff --git a/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java b/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java index 5e7eb4b0356..65d49ef3ed4 100644 --- a/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java +++ b/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java @@ -3217,6 +3217,24 @@ public static HttpResponse easyTransferAssetByPrivate(String httpNode, String pr } + /** + * constructor. + */ + public static HttpResponse getContractInfo(String httpNode, String contractAddress) { + try { + String requestUrl = "http://" + httpNode + "/wallet/getcontractinfo"; + JsonObject userBaseObj2 = new JsonObject(); + userBaseObj2.addProperty("value", contractAddress); + response = createConnect(requestUrl, userBaseObj2); + } catch (Exception e) { + e.printStackTrace(); + httppost.releaseConnection(); + return null; + } + return response; + } + + /** * constructor. */ diff --git a/framework/src/test/java/stest/tron/wallet/common/client/utils/JsonRpcBase.java b/framework/src/test/java/stest/tron/wallet/common/client/utils/JsonRpcBase.java index d1fe6b1e4e9..936386fa6af 100644 --- a/framework/src/test/java/stest/tron/wallet/common/client/utils/JsonRpcBase.java +++ b/framework/src/test/java/stest/tron/wallet/common/client/utils/JsonRpcBase.java @@ -114,7 +114,8 @@ public void deployJsonRpcUseResource() throws Exception { .usePlaintext(true) .build(); blockingStubFull = WalletGrpc.newBlockingStub(channelFull); - + Assert.assertTrue(PublicMethed.sendcoin(jsonRpcOwnerAddress, 2048000000L, + foundationAccountAddress, foundationAccountKey, blockingStubFull)); if (PublicMethed.queryAccount(jsonRpcOwnerAddress, blockingStubFull).getAssetV2Count() == 0L) { Assert.assertTrue(PublicMethed.sendcoin(jsonRpcOwnerAddress, 2048000000L, foundationAccountAddress, foundationAccountKey, blockingStubFull)); diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java index 100a90afd2e..9ab52bad429 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java @@ -5,21 +5,21 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; -import io.grpc.ManagedChannelBuilder; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.TimeUnit; + import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpResponse; import org.junit.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; -import org.tron.api.WalletGrpc; +import org.tron.api.GrpcAPI; import org.tron.common.utils.ByteArray; +import org.tron.protos.Protocol.Block; import stest.tron.wallet.common.client.utils.HttpMethed; + import stest.tron.wallet.common.client.utils.JsonRpcBase; @Slf4j @@ -38,22 +38,11 @@ public class Accounts001 extends JsonRpcBase { String txTrieRoot = null; String witnessAddress = null; String gas = null; - long blockTimeStamp = 0; - - - /** - * constructor. - */ - @BeforeClass(enabled = true) - public void beforeClass() { - channelFull = ManagedChannelBuilder.forTarget(fullnode) - .usePlaintext(true) - .build(); - blockingStubFull = WalletGrpc.newBlockingStub(channelFull); - } - - + String feeLimit = null; + List transactionIdList = null; + long size = 0; + long blockTimeStamp = 0; @Test(enabled = true, description = "Json rpc api of eth_accounts") public void test01JsonRpcApiTestForEthAccounts() throws Exception { @@ -87,6 +76,30 @@ public void test02JsonRpcApiTestForEthBlockNumber() throws Exception { Assert.assertTrue(Math.abs(blocknum1 - blocknum2) <= 2); } + @Test(enabled = true, description = "Json rpc api of eth_call") + public void test03JsonRpcApiTestForEthCall() throws Exception { + JsonObject param = new JsonObject(); + param.addProperty("from", ByteArray.toHexString(jsonRpcOwnerAddress)); + param.addProperty("to", trc20AddressHex); + param.addProperty("gas", "0"); + param.addProperty("gasPrice", "0"); + param.addProperty("value", "0"); + param.addProperty("data", "0x06fdde03"); + JsonArray params = new JsonArray(); + params.add(param); + params.add("latest"); + JsonObject requestBody = getJsonRpcBody("eth_call", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String dataResult = responseContent.getString("result"); + Assert.assertEquals( + dataResult, + "0x000000000000000000000000000000000000000000000000000" + + "00000000000200000000000000000000000000000000000000000" + + "00000000000000000000000a546f6b656e5452433230000000000" + + "00000000000000000000000000000000000"); + } + @Test(enabled = true, description = "Json rpc api of eth_chainId") public void test04JsonRpcApiTestForEthChainId() throws Exception { JsonArray params = new JsonArray(); @@ -103,6 +116,17 @@ public void test04JsonRpcApiTestForEthChainId() throws Exception { Assert.assertEquals(blockId1, blockId2); } + @Test(enabled = true, description = "Json rpc api of eth_coinbase") + public void test05JsonRpcApiTestForEthCoinbase() throws Exception { + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("eth_coinbase", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + + Assert.assertEquals( + responseContent.getString("result"), "0x41bafb56091591790e00aa05eaddcc7dc1474b5d4b"); + } + @Test(enabled = true, description = "Json rpc api of eth_gasPrice") public void test07JsonRpcApiTestForEthGasPrice() throws Exception { JsonArray params = new JsonArray(); @@ -130,7 +154,7 @@ public void test07JsonRpcApiTestForEthGasPrice() throws Exception { @Test(enabled = true, description = "Json rpc api of eth_getBalance") public void test08JsonRpcApiTestForEthGetBalance() throws Exception { JsonArray params = new JsonArray(); - params.add(ByteArray.toHexString(foundationAccountAddress)); + params.add("0x415624C12E308B03A1A6B21D9B86E3942FAC1AB92B"); params.add("latest"); JsonObject requestBody = getJsonRpcBody("eth_getBalance", params); response = getJsonRpc(jsonRpcNode, requestBody); @@ -142,35 +166,6 @@ public void test08JsonRpcApiTestForEthGetBalance() throws Exception { logger.info(balance2.toString()); Assert.assertEquals(balance1, balance2); } - // todo : - - @Test(enabled = false, description = "Json rpc api of eth_getBlockByHash") - public void test09JsonRpcApiTestForEthGetBlockByHash() throws Exception { - JsonArray params = new JsonArray(); - params.add(blockHash); - JsonObject requestBody = getJsonRpcBody("eth_getBlockByHash", params); - response = getJsonRpc(jsonRpcNode, requestBody); - responseContent = HttpMethed.parseResponseContent(response); - JSONObject getBlockByHashResult = responseContent.getJSONObject("result"); - Assert.assertNull(getBlockByHashResult.getString("nonce")); - Assert.assertNull(getBlockByHashResult.getString("sha3Uncles")); - Assert.assertNull(getBlockByHashResult.getString("receiptsRoot")); - Assert.assertNull(getBlockByHashResult.getString("difficulty")); - Assert.assertNull(getBlockByHashResult.getString("totalDifficulty")); - Assert.assertNull(getBlockByHashResult.getString("extraData")); - Assert.assertEquals(getBlockByHashResult.getString("number"), blockNumHex); - Assert.assertEquals(getBlockByHashResult.getString("hash"), "0x" + bid); - Assert.assertEquals(getBlockByHashResult.getString("parentHash"), "0x" + parentHash); - Assert.assertEquals(getBlockByHashResult.getString("transactionsRoot"), "0x" + txTrieRoot); - Assert.assertEquals(getBlockByHashResult.getString("miner"), "0x" + witnessAddress); - // Assert.assertEquals(getBlockByHashResult.getString("size"), "0x"+witness_address); - Assert.assertEquals(getBlockByHashResult.getString("gasUsed"), gas); - // Assert.assertEquals(getBlockByHashResult.getString("gasLimit"), gas); - Assert.assertEquals( - Long.parseLong(getBlockByHashResult.getString("timestamp").substring(2), 16), - blockTimeStamp); - Long.parseLong(getBlockByHashResult.getString("timestamp").substring(2), 16); - } @Test(enabled = true, description = "Json rpc api of eth_getBlockTransactionCountByHash") public void test11JsonRpcApiTestForEthGetBlockTransactionCountByHash() throws Exception { @@ -237,6 +232,44 @@ public void test12JsonRpcApiTestForEthGetBlockTransactionCountByNum02() throws E Assert.assertEquals(transactionNum1, transactionNum2); } + @Test(enabled = true, description = "Json rpc api of eth_getCode") + public void test13JsonRpcApiTestForEthGetCode() throws Exception { + + JsonArray params = new JsonArray(); + params.add(contractAddressFrom58); + params.add("latest"); + JsonObject requestBody = getJsonRpcBody("eth_getCode", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String codeFromJsonRpc = responseContent.getString("result").substring(2); + logger.info(codeFromJsonRpc); + response = HttpMethed.getContractInfo(httpFullNode, contractAddressFrom58); + logger.info("13contractAddressFrom58:" + contractAddressFrom58); + responseContent = HttpMethed.parseResponseContent(response); + String codeFromHttp = responseContent.getString("runtimecode"); + logger.info(codeFromHttp); + Assert.assertEquals(codeFromJsonRpc, codeFromHttp); + } + + @Test(enabled = false, description = "Json rpc api of eth_getStorageAt") + public void test14JsonRpcApiTestForEthGetStorageAt01() throws Exception { + + JsonArray params = new JsonArray(); + params.add("41e5dc01c00136012136e82a5bfda5959110a3231f"); + params.add("latest"); + JsonObject requestBody = getJsonRpcBody("c", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String codeFromJsonRpc = responseContent.getString("result").substring(2); + logger.info(codeFromJsonRpc); + response = + HttpMethed.getContractInfo(httpFullNode, "41e5dc01c00136012136e82a5bfda5959110a3231f"); + responseContent = HttpMethed.parseResponseContent(response); + String codeFromHttp = responseContent.getString("runtimecode"); + logger.info(codeFromHttp); + Assert.assertEquals(codeFromJsonRpc, codeFromHttp); + } + @Test(enabled = true, description = "Json rpc api of eth_getTransactionByBlockNumberAndIndex") public void test15JsonRpcApiTestForEthGetTransactionByBlockNumberAndIndex() throws Exception { logger.info("15blockNum:" + blockNum); @@ -244,7 +277,7 @@ public void test15JsonRpcApiTestForEthGetTransactionByBlockNumberAndIndex() thro logger.info("blockNumHex:" + blockNumHex); JsonArray params = new JsonArray(); params.add(blockNumHex); - + // 判断是块中的第几个交易 indexNum = 0; response = HttpMethed.getBlockByNum(httpFullNode, blockNum); responseContent = HttpMethed.parseResponseContent(response); @@ -263,6 +296,14 @@ public void test15JsonRpcApiTestForEthGetTransactionByBlockNumberAndIndex() thro .getJSONObject("block_header") .getJSONObject("raw_data") .getString("witness_address"); + feeLimit = + responseContent + .getJSONArray("transactions") + .getJSONObject(0) + .getJSONObject("raw_data") + .getString("fee_limit"); + logger.info(feeLimit); + JSONObject getBlockByNumResult = null; for (int i = 0; i < responseContent.getJSONArray("transactions").size(); i++) { if (txid.equals( @@ -270,37 +311,50 @@ public void test15JsonRpcApiTestForEthGetTransactionByBlockNumberAndIndex() thro indexNum = i; getBlockByNumResult = responseContent.getJSONArray("transactions").getJSONObject(i); bid = responseContent.getString("blockID"); - System.out.println(bid); break; } } + transactionIdList = new ArrayList<>(); + if (responseContent.getJSONArray("transactions").size() > 0) { + for (int i = 0; i < responseContent.getJSONArray("transactions").size(); i++) { + transactionIdList.add( + "0x" + responseContent.getJSONArray("transactions").getJSONObject(i).getString("txID")); + } + } + logger.info("15transactionIdList:" + transactionIdList); logger.info(String.valueOf(indexNum)); indexHex = "0x" + Integer.toHexString(indexNum); - logger.info("indexHex"); + logger.info("indexHex:" + indexHex); params.add(indexHex); - JsonObject requestBody = getJsonRpcBody("eth_getTransactionByBlockNumberAndIndex", params); response = getJsonRpc(jsonRpcNode, requestBody); responseContent = HttpMethed.parseResponseContent(response); result = responseContent.getJSONObject("result"); - + logger.info("15 result" + result); Map jsonrpcResult = new HashMap(); for (Map.Entry entry : result.entrySet()) { jsonrpcResult.put(entry.getKey(), entry.getValue()); } transacionHash = jsonrpcResult.get("hash").toString(); + logger.info("transactionHash:" + transacionHash); blockHash = jsonrpcResult.get("blockHash").toString(); logger.info("jsonrpcResult:" + jsonrpcResult); response = HttpMethed.getTransactionInfoByBlocknum(httpFullNode, blockNum); + logger.info("response:" + response); gas = jsonrpcResult.get("gas").toString(); System.out.println(blockNum); List responseContent1 = HttpMethed.parseResponseContentArray(response); + logger.info("responseContent1:" + responseContent1); blockTimeStamp = responseContent1.get(0).getLong("blockTimeStamp"); - Assert.assertEquals( - jsonrpcResult.get("gas").toString(), - "0x" - + Long.toHexString( - responseContent1.get(0).getJSONObject("receipt").getLong("energy_usage_total"))); + long gas = 0; + for (int i = 0; i < responseContent1.size(); i++) { + if (responseContent1.get(i).getString("id").equals(transactionIdList.get(0).substring(2))) { + gas = responseContent1.get(i).getJSONObject("receipt").getLong("energy_usage_total"); + break; + } + } + + Assert.assertEquals(jsonrpcResult.get("gas").toString(), "0x" + Long.toHexString(gas)); Assert.assertNull(jsonrpcResult.get("nonce")); Assert.assertEquals( jsonrpcResult.get("hash").toString(), "0x" + getBlockByNumResult.getString("txID")); @@ -331,7 +385,6 @@ public void test15JsonRpcApiTestForEthGetTransactionByBlockNumberAndIndex() thro .substring(2)); // Assert.assertEquals(jsonrpcResult.get("gasPrice").toString(),realGasPrice); Assert.assertEquals(jsonrpcResult.get("value").toString(), "0x1389"); - String data; if (getBlockByNumResult.getJSONObject("raw_data").getString("data") == null) { data = "0x"; @@ -360,7 +413,6 @@ public void test16JsonRpcApiTestForEthGetTransactionByBlockHashAndIndex() throws params.add("0x" + bid); params.add(indexHex); logger.info("indexHex:" + indexHex); - JsonObject requestBody = getJsonRpcBody("eth_getTransactionByBlockHashAndIndex", params); response = getJsonRpc(jsonRpcNode, requestBody); responseContent = HttpMethed.parseResponseContent(response); @@ -372,7 +424,6 @@ public void test16JsonRpcApiTestForEthGetTransactionByBlockHashAndIndex() throws public void test17JsonRpcApiTestForEthGetTransactionByHash() throws Exception { JsonArray params = new JsonArray(); params.add(transacionHash); - JsonObject requestBody = getJsonRpcBody("eth_getTransactionByHash", params); response = getJsonRpc(jsonRpcNode, requestBody); responseContent = HttpMethed.parseResponseContent(response); @@ -380,6 +431,68 @@ public void test17JsonRpcApiTestForEthGetTransactionByHash() throws Exception { Assert.assertEquals(result, result1); } + @Test(enabled = false, description = "Json rpc api of eth_getTransactionReceipt") + public void test18JsonRpcApiTestForEthGetTransactionReceipt() throws Exception { + JsonArray params = new JsonArray(); + params.add(transacionHash); + JsonObject requestBody = getJsonRpcBody("eth_getTransactionReceipt", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + JSONObject result1 = responseContent.getJSONObject("result"); + logger.info("result:" + result.toString()); + Assert.assertEquals(result, result1); + } + + @Test(enabled = true, description = "Json rpc api of eth_getUncleByBlockHashAndIndex") + public void test19JsonRpcApiTestForEthGetUncleByBlockHashAndIndex() throws Exception { + JsonArray params = new JsonArray(); + params.add("0x0000000000f9cc56243898cbe88685678855e07f51c5af91322c225ce3693868"); + params.add("0x"); + JsonObject requestBody = getJsonRpcBody("eth_getUncleByBlockHashAndIndex", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String result = responseContent.getString("result"); + logger.info(result); + Assert.assertNull(result); + } + + @Test(enabled = true, description = "Json rpc api of eth_getUncleByBlockNumberAndIndex") + public void test20JsonRpcApiTestForEthGetUncleByBlockNumberAndIndex() throws Exception { + JsonArray params = new JsonArray(); + params.add("0xeb82f0"); + params.add("0x"); + JsonObject requestBody = getJsonRpcBody("eth_getUncleByBlockNumberAndIndex", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String result = responseContent.getString("result"); + logger.info(result); + Assert.assertNull(result); + } + + @Test(enabled = true, description = "Json rpc api of eth_getUncleCountByBlockHash") + public void test21JsonRpcApiTestForEthGetUncleCountByBlockHash() throws Exception { + JsonArray params = new JsonArray(); + params.add("0x0000000000f9cc56243898cbe88685678855e07f51c5af91322c225ce3693868"); + JsonObject requestBody = getJsonRpcBody("eth_getUncleCountByBlockHash", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String result = responseContent.getString("result"); + logger.info(result); + Assert.assertEquals(result, "0x0"); + } + + @Test(enabled = true, description = "Json rpc api of eth_getUncleCountByBlockNumber") + public void test22JsonRpcApiTestForEthGetUncleCountByBlockNumber() throws Exception { + JsonArray params = new JsonArray(); + params.add("eth_getUncleCountByBlockNumber"); + JsonObject requestBody = getJsonRpcBody("eth_getUncleCountByBlockNumber", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String result = responseContent.getString("result"); + logger.info(result); + Assert.assertEquals(result, "0x0"); + } + @Test(enabled = true, description = "Json rpc api of eth_getWork") public void test23JsonRpcApiTestForEthGetWork() throws Exception { JsonArray params = new JsonArray(); @@ -408,6 +521,17 @@ public void test24JsonRpcApiTestForEthHashRate() throws Exception { Assert.assertEquals(result, "0x0"); } + @Test(enabled = true, description = "Json rpc api of eth_mining") + public void test25JsonRpcApiTestForEthMining() throws Exception { + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("eth_mining", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String result = responseContent.getString("result"); + logger.info(result); + Assert.assertEquals(result, "true"); + } + @Test(enabled = true, description = "Json rpc api of eth_protocolVersion") public void test26JsonRpcApiTestForEthProtocolVersion() throws Exception { JsonArray params = new JsonArray(); @@ -439,9 +563,27 @@ public void test27JsonRpcApiTestForEthSyncing() throws Exception { Assert.assertTrue(temp.containsKey("highestBlock")); } + @Test(enabled = true, description = "Json rpc api of net_listening") + public void test28JsonRpcApiTestForNetListening() throws Exception { + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("net_listening", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + Boolean temp = responseContent.getBoolean("result"); + logger.info(temp.toString()); + response = HttpMethed.getNodeInfo(httpFullNode); + responseContent = HttpMethed.parseResponseContent(response); + boolean expect = false; + System.out.println(responseContent); + int num = responseContent.getInteger("activeConnectCount"); + if (num >= 1) { + expect = true; + } + Assert.assertEquals(temp, expect); + } + @Test(enabled = true, description = "Json rpc api of net_peerCount") public void test29JsonRpcApiTestForNetPeerCount() throws Exception { - JsonArray params = new JsonArray(); JsonObject requestBody = getJsonRpcBody("net_peerCount", params); response = getJsonRpc(jsonRpcNode, requestBody); @@ -466,6 +608,25 @@ public void test30JsonRpcApiTestForEthVersion() throws Exception { Assert.assertEquals(firstBlockHash1, firstBlockHash2); } + @Test(enabled = true, description = "Json rpc api of web3_clientVersion") + public void test31JsonRpcApiTestForWeb3ClientVersion() throws Exception { + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("web3_clientVersion", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String result = responseContent.getString("result"); + List resultList = new ArrayList<>(); + for (String str : result.split("/")) { + resultList.add(str); + } + Assert.assertEquals(resultList.size(), 5); + Assert.assertEquals(resultList.get(0), "TRON"); + Assert.assertEquals(resultList.get(1).substring(0, 1), "v"); + Assert.assertEquals(resultList.get(2), "Linux"); + Assert.assertEquals(resultList.get(3), "Java1.8"); + Assert.assertEquals(resultList.get(4).substring(0, 11), "GreatVoyage"); + } + @Test(enabled = true, description = "Json rpc api of web3_sha3") public void test32JsonRpcApiTestForWeb3Sha3() throws Exception { JsonArray params = new JsonArray(); @@ -648,17 +809,149 @@ public void test44JsonRpcApiTestForEthSubmitHashrate() throws Exception { errorMessage, "the method eth_submitHashrate does not exist/is not available"); } + @Test(enabled = true, description = "Json rpc api of eth_getBlockByHash params is false") + public void test45JsonRpcApiTestForEthGetBlockByHash() throws Exception { + JsonArray params = new JsonArray(); + params.add(blockHash); + params.add(false); + JsonObject requestBody = getJsonRpcBody("eth_getBlockByHash", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + JSONObject getBlockByHashResult = responseContent.getJSONObject("result"); - /** - * constructor. - */ + Assert.assertNull(getBlockByHashResult.getString("nonce")); + Assert.assertNull(getBlockByHashResult.getString("sha3Uncles")); + Assert.assertNull(getBlockByHashResult.getString("receiptsRoot")); + Assert.assertNull(getBlockByHashResult.getString("difficulty")); + Assert.assertNull(getBlockByHashResult.getString("totalDifficulty")); + Assert.assertNull(getBlockByHashResult.getString("extraData")); + Assert.assertNull(getBlockByHashResult.getString("baseFeePerGas")); + Assert.assertNull(getBlockByHashResult.getString("mixHash")); + Assert.assertEquals(getBlockByHashResult.getString("uncles"), new ArrayList<>().toString()); + Assert.assertEquals(getBlockByHashResult.getString("stateRoot"), "0x"); + Assert.assertEquals( + getBlockByHashResult.getString("logsBloom"), + "0x00000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + "00000000000000000000000000000000000000000000000000000000000000000000000" + + "00000000000000000000000000000000000000000000000000000000000000000000000000000000" + + "000000000000000000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000000000000" + + "00000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000"); + Assert.assertEquals(getBlockByHashResult.getString("number"), blockNumHex); + Assert.assertEquals(getBlockByHashResult.getString("hash"), "0x" + bid); + Assert.assertEquals(getBlockByHashResult.getString("parentHash"), "0x" + parentHash); + Assert.assertEquals(getBlockByHashResult.getString("transactionsRoot"), "0x" + txTrieRoot); + Assert.assertEquals(getBlockByHashResult.getString("miner"), "0x" + witnessAddress); + Assert.assertEquals(getBlockByHashResult.getString("gasUsed"), gas); + Assert.assertEquals( + String.valueOf(Long.parseLong(getBlockByHashResult.getString("gasLimit").substring(2), 16)), + feeLimit); + Assert.assertEquals( + Long.parseLong(getBlockByHashResult.getString("timestamp").substring(2), 16), + blockTimeStamp); + final GrpcAPI.NumberMessage message = + GrpcAPI.NumberMessage.newBuilder().setNum(blockNum).build(); + Block bl = blockingStubFull.getBlockByNum(message); + logger.info("sizeFromJrpc:" + bl.getSerializedSize()); + logger.info( + "sizeFromJsonRPc:" + + Long.parseLong(getBlockByHashResult.getString("size").substring(2), 16)); + size = bl.getSerializedSize(); + Assert.assertEquals( + Long.parseLong(getBlockByHashResult.getString("size").substring(2), 16), + bl.getSerializedSize()); - @AfterClass - public void shutdown() throws InterruptedException { - if (channelFull != null) { - channelFull.shutdown().awaitTermination(5, TimeUnit.SECONDS); + Long.parseLong(getBlockByHashResult.getString("timestamp").substring(2), 16); + JSONArray transactionId = getBlockByHashResult.getJSONArray("transactions"); + List transactionIdListFromGetBlockByHash = new ArrayList<>(); + if (transactionId.size() > 0) { + for (int i = 0; i < transactionId.size(); i++) { + transactionIdListFromGetBlockByHash.add(transactionId.get(i).toString()); + } } + Assert.assertEquals(transactionIdListFromGetBlockByHash, transactionIdList); } + @Test(enabled = true, description = "Json rpc api of eth_getBlockByNumber params is true") + public void test46JsonRpcApiTestForEthGetBlockByNumber() throws Exception { + JsonArray params = new JsonArray(); + params.add(blockNumHex); + logger.info("46blockNumHex:" + blockNumHex); + params.add(true); + JsonObject requestBody = getJsonRpcBody("eth_getBlockByNumber", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + JSONObject getBlockByHashResult = responseContent.getJSONObject("result"); + logger.info("getBlockByHashResult:" + getBlockByHashResult); + Assert.assertNull(getBlockByHashResult.getString("nonce")); + Assert.assertNull(getBlockByHashResult.getString("sha3Uncles")); + Assert.assertNull(getBlockByHashResult.getString("receiptsRoot")); + Assert.assertNull(getBlockByHashResult.getString("difficulty")); + Assert.assertNull(getBlockByHashResult.getString("totalDifficulty")); + Assert.assertNull(getBlockByHashResult.getString("extraData")); + Assert.assertNull(getBlockByHashResult.getString("baseFeePerGas")); + Assert.assertNull(getBlockByHashResult.getString("mixHash")); + Assert.assertEquals(getBlockByHashResult.getString("uncles"), new ArrayList<>().toString()); + Assert.assertEquals(getBlockByHashResult.getString("stateRoot"), "0x"); + Assert.assertEquals( + getBlockByHashResult.getString("logsBloom"), + "0x00000000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000000000" + + "00000000000000000000000000000000000000000000000000000000000000000000000" + + "000000000000000000000000000000000000000000000000000000000000000000000000" + + "000000000000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000"); + Assert.assertEquals(getBlockByHashResult.getString("number"), blockNumHex); + Assert.assertEquals(getBlockByHashResult.getString("hash"), "0x" + bid); + Assert.assertEquals(getBlockByHashResult.getString("parentHash"), "0x" + parentHash); + Assert.assertEquals(getBlockByHashResult.getString("transactionsRoot"), "0x" + txTrieRoot); + Assert.assertEquals(getBlockByHashResult.getString("miner"), "0x" + witnessAddress); + Assert.assertEquals(getBlockByHashResult.getString("gasUsed"), gas); + Assert.assertEquals( + String.valueOf(Long.parseLong(getBlockByHashResult.getString("gasLimit").substring(2), 16)), + feeLimit); + Assert.assertEquals( + Long.parseLong(getBlockByHashResult.getString("timestamp").substring(2), 16), + blockTimeStamp); + Assert.assertEquals( + Long.parseLong(getBlockByHashResult.getString("size").substring(2), 16), size); + + JSONArray transactionsList = getBlockByHashResult.getJSONArray("transactions"); + logger.info("transactionsList:" + transactionsList); + List transactionInfoListFromGetBlockByHash = new ArrayList<>(); + if (transactionsList.size() > 0) { + for (int i = 0; i < transactionsList.size(); i++) { + transactionInfoListFromGetBlockByHash.add(transactionsList.get(i).toString()); + } + } + List transactionInfoListFromTransactionByBlockNumberAndIndex = new ArrayList<>(); + for (int i = 0; i < transactionsList.size(); i++) { + JsonArray paramsForEthGetTransactionByBlockNumberAndIndex = new JsonArray(); + paramsForEthGetTransactionByBlockNumberAndIndex.add(blockNumHex); + String index = "0x" + Integer.toHexString(i); + logger.info("index:" + index); + paramsForEthGetTransactionByBlockNumberAndIndex.add(index); + logger.info( + "paramsForEthGetTransactionByBlockNumberAndIndex:" + + paramsForEthGetTransactionByBlockNumberAndIndex); + JsonObject requestBodyForTransactionByBlockNumberAndIndex = + getJsonRpcBody( + "eth_getTransactionByBlockNumberAndIndex", + paramsForEthGetTransactionByBlockNumberAndIndex); + response = getJsonRpc(jsonRpcNode, requestBodyForTransactionByBlockNumberAndIndex); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("responseContent:" + responseContent); + result = responseContent.getJSONObject("result"); + logger.info("result:" + result); + transactionInfoListFromTransactionByBlockNumberAndIndex.add(result.toString()); + } + Assert.assertEquals( + transactionInfoListFromGetBlockByHash, + transactionInfoListFromTransactionByBlockNumberAndIndex); + } } From b913d59ea7b9d49191eacc6d7c6dd4e3fc74442f Mon Sep 17 00:00:00 2001 From: liukai Date: Mon, 13 Sep 2021 17:33:21 +0800 Subject: [PATCH 242/341] Optimization of single parameter startup --- start.sh | 54 ++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 8 deletions(-) diff --git a/start.sh b/start.sh index f87c17bcb02..3b23acd761e 100644 --- a/start.sh +++ b/start.sh @@ -8,6 +8,10 @@ JAR_NAME="FullNode.jar" FULL_START_OPT='' GITHUB_BRANCH='master' +# shell option +ALL_OPT=$@ +ALL_OPT_LENGTH=${#ALL_OPT[@]} + # start service option MAX_STOP_TIME=60 # modify this option to allow the minimum memory to be started, unit MB @@ -47,7 +51,7 @@ checkVersion() { if [[ -n $github_release_version ]]; then echo "info: github latest version: $github_release_version" echo $github_release_version - else + else echo 'info: not getting the latest version' exit fi @@ -96,9 +100,9 @@ mkdirFullNode() { } quickStart() { - if [[ -n $github_release_version ]]; then + full_node_version=$(`echo getLatestReleaseVersion`) + if [[ -n $full_node_version ]]; then mkdirFullNode - full_node_version=$(`echo getLatestReleaseVersion`) echo "info: check latest version: $full_node_version" echo 'info: download config' download https://raw.githubusercontent.com/tronprotocol/tron-deployment/$GITHUB_BRANCH/$FULL_NODE_CONFIG $FULL_NODE_CONFIG @@ -238,12 +242,15 @@ setJVMMemory() { startService() { echo $(date) >>start.log - logtime=$(date +%Y-%m-%d_%H-%M-%S) - if [[ ! $JAR_NAME =~ '-c' ]]; then FULL_START_OPT="$FULL_START_OPT -c $DEFAULT_FULL_NODE_CONFIG" fi + if [[ ! -f $JAR_NAME ]]; then + echo "warn: jar file $JAR_NAME not exist" + exit + fi + nohup java -Xms$JVM_MS -Xmx$JVM_MX -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -Xloggc:./gc.log \ -XX:+PrintGCDateStamps -XX:+CMSParallelRemarkEnabled -XX:ReservedCodeCacheSize=256m -XX:+UseCodeCacheFlushing \ -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m \ @@ -252,7 +259,7 @@ startService() { $JAR_NAME $FULL_START_OPT >>start.log 2>&1 & checkPid echo "info: start java-tron with pid $pid on $HOSTNAME" - echo "info: stop service execution: sh start.sh --stop" + echo "info: if you need to stop the service, execute: sh start.sh --stop" } rebuildManifest() { @@ -384,6 +391,10 @@ while [ -n "$1" ]; do shift 1 ;; --run) + if [[ $ALL_OPT_LENGTH -eq 1 ]]; then + restart + exit + fi RUN=true shift 1 ;; @@ -391,7 +402,33 @@ while [ -n "$1" ]; do stopService exit ;; + FullNode) + RUN=true + shift 1 + ;; + FullNode.jar) + RUN=true + shift 1 + ;; + *.jar) + RUN=true + shift 1 + ;; *) + if [[ $ALL_OPT_LENGTH -eq 1 ]]; then + if [[ ! "$1" =~ "-" ]] && [[ ! "$1" =~ "--" ]]; then + if [[ $1 =~ '.jar' ]]; then + JAR_NAME=$1 + else + JAR_NAME="$1.jar" + fi + restart + exit + else + echo "warn: option $1 does not exist" + exit + fi + fi echo "warn: option $1 does not exist" exit ;; @@ -428,11 +465,12 @@ if [[ $DOWNLOAD == true ]]; then fi fi -if [[ $RUN == true ]]; then +if [[ $ALL_OPT_LENGTH -eq 0 ]]; then restart exit fi -if [[ $# -eq 0 ]]; then +if [[ $RUN == true ]]; then restart + exit fi \ No newline at end of file From 8671091d5970afd7692a9fb60d6e9d423b73e184 Mon Sep 17 00:00:00 2001 From: sophiawang <1975054324@qq.com> Date: Mon, 13 Sep 2021 17:57:38 +0800 Subject: [PATCH 243/341] ignore unit test --- .../org/tron/common/overlay/discover/node/NodeManagerTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/src/test/java/org/tron/common/overlay/discover/node/NodeManagerTest.java b/framework/src/test/java/org/tron/common/overlay/discover/node/NodeManagerTest.java index c5f12861b3a..727c29ef0f0 100644 --- a/framework/src/test/java/org/tron/common/overlay/discover/node/NodeManagerTest.java +++ b/framework/src/test/java/org/tron/common/overlay/discover/node/NodeManagerTest.java @@ -9,6 +9,7 @@ import org.junit.After; import org.junit.Assert; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -23,7 +24,7 @@ import org.tron.core.config.args.Args; import org.tron.core.db.Manager; - +@Ignore public class NodeManagerTest { private static final Logger logger = LoggerFactory.getLogger("Test"); From 3dd9e98ab86b9d3c082987976994fa1801599451 Mon Sep 17 00:00:00 2001 From: liukai Date: Mon, 13 Sep 2021 18:02:28 +0800 Subject: [PATCH 244/341] Optimization of single parameter startup --- start.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/start.sh b/start.sh index 3b23acd761e..693e6f6e7e7 100644 --- a/start.sh +++ b/start.sh @@ -9,8 +9,7 @@ FULL_START_OPT='' GITHUB_BRANCH='master' # shell option -ALL_OPT=$@ -ALL_OPT_LENGTH=${#ALL_OPT[@]} +ALL_OPT_LENGTH=$# # start service option MAX_STOP_TIME=60 From 20f78c607341fba993c514d835a8a878829ca835 Mon Sep 17 00:00:00 2001 From: liukai Date: Mon, 13 Sep 2021 18:19:36 +0800 Subject: [PATCH 245/341] Optimization of single parameter startup --- start.sh | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/start.sh b/start.sh index 693e6f6e7e7..77b4cadccde 100644 --- a/start.sh +++ b/start.sh @@ -3,7 +3,7 @@ FULL_NODE_DIR="FullNode" FULL_NODE_CONFIG="main_net_config.conf" DEFAULT_FULL_NODE_CONFIG='config.conf' -FULL_NODE_SHELL="start.sh" +#FULL_NODE_SHELL="start.sh" JAR_NAME="FullNode.jar" FULL_START_OPT='' GITHUB_BRANCH='master' @@ -423,9 +423,6 @@ while [ -n "$1" ]; do fi restart exit - else - echo "warn: option $1 does not exist" - exit fi fi echo "warn: option $1 does not exist" From 49d6b427e134c294433092bc80be3aea7a6cdd33 Mon Sep 17 00:00:00 2001 From: daxinzang1 <280474930@qq.com> Date: Mon, 13 Sep 2021 19:31:43 +0800 Subject: [PATCH 246/341] Change json deploy --- .../tron/wallet/common/client/utils/JsonRpcBase.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/framework/src/test/java/stest/tron/wallet/common/client/utils/JsonRpcBase.java b/framework/src/test/java/stest/tron/wallet/common/client/utils/JsonRpcBase.java index 936386fa6af..677f731ff55 100644 --- a/framework/src/test/java/stest/tron/wallet/common/client/utils/JsonRpcBase.java +++ b/framework/src/test/java/stest/tron/wallet/common/client/utils/JsonRpcBase.java @@ -12,6 +12,7 @@ import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.Optional; import java.util.Random; @@ -160,10 +161,13 @@ public void deployContract() throws Exception { param.addProperty("from", ByteArray.toHexString(jsonRpcOwnerAddress)); param.addProperty("name", "transferTokenContract"); param.addProperty("gas", "0x245498"); - String code = Configuration.getByPath("testng.conf") - .getString("code.code_ContractTrcToken001_transferTokenContract"); - String abi = Configuration.getByPath("testng.conf") - .getString("abi.abi_ContractTrcToken001_transferTokenContract"); + String filePath = "./src/test/resources/soliditycode/contractTrcToken001.sol"; + String contractName = "tokenTest"; + HashMap retMap = PublicMethed.getBycodeAbi(filePath, contractName); + + String code = retMap.get("byteCode").toString(); + String abi = retMap.get("abI").toString(); + param.addProperty("abi", abi); param.addProperty("data", code); param.addProperty("consumeUserResourcePercent", 100); From 890e74eff1540a641c9526f945cc6683e1d9db3f Mon Sep 17 00:00:00 2001 From: sophiawang <1975054324@qq.com> Date: Tue, 14 Sep 2021 10:39:00 +0800 Subject: [PATCH 247/341] enable unit test --- .../org/tron/common/overlay/discover/node/NodeManagerTest.java | 2 +- .../java/org/tron/core/db/EnergyPriceHistoryLoaderTest.java | 2 +- framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java | 2 +- .../test/java/org/tron/core/services/ProposalServiceTest.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/framework/src/test/java/org/tron/common/overlay/discover/node/NodeManagerTest.java b/framework/src/test/java/org/tron/common/overlay/discover/node/NodeManagerTest.java index 727c29ef0f0..2697243d19b 100644 --- a/framework/src/test/java/org/tron/common/overlay/discover/node/NodeManagerTest.java +++ b/framework/src/test/java/org/tron/common/overlay/discover/node/NodeManagerTest.java @@ -24,7 +24,7 @@ import org.tron.core.config.args.Args; import org.tron.core.db.Manager; -@Ignore + public class NodeManagerTest { private static final Logger logger = LoggerFactory.getLogger("Test"); diff --git a/framework/src/test/java/org/tron/core/db/EnergyPriceHistoryLoaderTest.java b/framework/src/test/java/org/tron/core/db/EnergyPriceHistoryLoaderTest.java index 813b3159712..36e28ecfd0d 100644 --- a/framework/src/test/java/org/tron/core/db/EnergyPriceHistoryLoaderTest.java +++ b/framework/src/test/java/org/tron/core/db/EnergyPriceHistoryLoaderTest.java @@ -29,7 +29,7 @@ import org.tron.protos.Protocol.Proposal; import org.tron.protos.Protocol.Proposal.State; -@Ignore + @Slf4j public class EnergyPriceHistoryLoaderTest { diff --git a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java index 878a4b6a6c0..52213f3415d 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java @@ -14,7 +14,7 @@ import org.tron.common.utils.Commons; import org.tron.core.services.jsonrpc.CallArguments; -@Ignore + public class JsonRpcTest { public void generateCallParameterWIthMethodAndParam() { diff --git a/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java b/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java index 8a01a2f8225..69053af9b14 100644 --- a/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java +++ b/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java @@ -23,7 +23,7 @@ import org.tron.core.utils.ProposalUtil.ProposalType; import org.tron.protos.Protocol.Proposal; -@Ignore + public class ProposalServiceTest { private TronApplicationContext context; From 64456da5e3b48b20b67975726a4a7257fd64f51c Mon Sep 17 00:00:00 2001 From: liukai Date: Tue, 14 Sep 2021 14:20:20 +0800 Subject: [PATCH 248/341] Optimize shell.md --- shell.md | 94 ++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 60 insertions(+), 34 deletions(-) diff --git a/shell.md b/shell.md index 5d5bc62a612..acd3b2642f5 100644 --- a/shell.md +++ b/shell.md @@ -1,19 +1,44 @@ +# Quick Start Scripting Tool -## Quick Start Scripting Tool +# Introduction -## Introduction +Using the `start.sh` script, you can quickly and easily run and build java-tron. -Using the `start.sh` script, you can quickly and easily run and build projects. - -If you have already downloaded `java-tron`, you can use `start.sh` to run `java-tron`, or if you have not downloaded java-tron code or jar packages, you can use `start.sh` to download, compile, run or get the latest release version in the form of a `jar package ` and run. +If you already downloaded the `FullNode.jar`, you can use `start.sh` to run it, or if you have not downloaded java-tron code or jar packages, you can use `start.sh` to download the source code, compile, run or get the latest release version in the form of a `jar package ` and run. *** -## Usage +# Usage + +## examples + +* Start the service + + ``` + sh start.sh --run + ``` + +* Stop the service + + ``` + sh start.sh --stop + ``` + +* Get the latest release + + ``` + sh start.sh --release --run + ``` -### Options +* Clone source code and run -#### service Operation + ``` + sh start -cb --run + ``` + +## Options + +### Service operation * `--run` @@ -25,32 +50,32 @@ If you have already downloaded `java-tron`, you can use `start.sh` to run `java- * `-c` - load the specified path configuration file, default load the `config.conf` at the same level as `FullNode.jar` + Specify the configuration file, by default it will load the `config.conf` in the same directory as `FullNode.jar` * `-d` - specify the database storage path, The default is in the current directory where `FullNode.jar` is located + Specify the database storage path, The default path is the same directory where `FullNode.jar` is located. * `-j` - specify the directory where the program is located, default package name `FullNode.jar ` + Specify the jar package, default value is the `FullNode.jar` in the current path. * `-mem` - specifies the memory of the started service, size in`MB`,jvm's startup maximum memory will be adjusted according to this parameter + Specify the maximum memory of the `FullNode.jar` service in`MB`, jvm's startup maximum memory will be adjusted according to this parameter. -#### build project +### build project * `-cb` - start.sh can be used independently, get the latest code, and compile + Clone the latest source code and compile. * `--release` - get the latest version of the `jar` package from github + Get the latest released version of the `jar` package from github. -#### rebuild manifest +### rebuild the manifest * `-d` @@ -69,17 +94,17 @@ If you have already downloaded `java-tron`, you can use `start.sh` to run `java- *** -### How to use +## How to use * Local mode - Start the service using the native Jar package + Start the service using the local Jar package * Online mode Get the latest code or latest release from github and start the service -#### 1.local mode +### 1.local mode Format: @@ -99,28 +124,28 @@ sh start.sh --run sh start.sh --stop ``` +### 2.online mode - -#### 2.online mode * Get the latest release -* Clone code and build + +* Clone the source code and build **Get the latest release** Format: ``` -sh start.sh <[--release | -cb]> <--run> [-m ] | [-b ] | [-d | [-dr | --disable-rewrite-manifes]] +sh start.sh <[--release | -cb]> <--run> [-m ] | [-b ] | [-d | [-dr | --disable-rewrite-manifes]] ``` -Get the latest version up and running -demo: +Get the latest version. + ``` sh start.sh --release --run ``` -contains the following files: +You will following file structure after executed the above command and the `FullNode.jar` will be started up. ``` ├── ... @@ -130,11 +155,11 @@ contains the following files: ├── start.sh ``` -**clone code and build** +**clone the source code and build** -Get the latest code from master branch of https://github.com/tronprotocol/java-tron and compile download the latest release. +Get the latest code from master branch of https://github.com/tronprotocol/java-tron and compile. -After using this command, the FullNode directory will be created and the compiled file FullNode.jar and related configuration files will be copied to this directory +After using this command, the "FullNode" directory will be created and the compiled file `FullNode.jar` and related configuration files will be copied to this directory demo: @@ -142,7 +167,7 @@ demo: sh start.sh -cb --run ``` -contains the following files: +Following file structure will be created: ``` ├── ... @@ -175,12 +200,12 @@ contains the following files: ├── start.sh ``` -#### 3.rebuild manifest tool +### 3.rebuild manifest tool -This tool provides the ability to reformat the manifest according to the current database,Enabled by default. +This tool provides the ability to reformat the manifest based on current database, Enabled by default. + +1.Local mode: -Demo -1.local mode: ``` sh start.sh --run -d /tmp/db/database -m 128 -b 64000 ``` @@ -190,4 +215,5 @@ sh start.sh --run -d /tmp/db/database -m 128 -b 64000 ``` sh start.sh --release --run -d /tmp/db/database -m 128 -b 64000 ``` + For more design details, please refer to: [TIP298](https://github.com/tronprotocol/tips/issues/298) | [Leveldb Startup Optimization Plugins](https://github.com/tronprotocol/documentation-en/blob/master/docs/developers/archive-manifest.md) \ No newline at end of file From ce4c43792ec751326e714b5a7492bc11061ecfa7 Mon Sep 17 00:00:00 2001 From: liukai Date: Tue, 14 Sep 2021 14:21:42 +0800 Subject: [PATCH 249/341] Optimize shell.md --- shell.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/shell.md b/shell.md index acd3b2642f5..037f60b82df 100644 --- a/shell.md +++ b/shell.md @@ -14,15 +14,15 @@ If you already downloaded the `FullNode.jar`, you can use `start.sh` to run it, * Start the service - ``` + ``` sh start.sh --run - ``` + ``` * Stop the service - ``` + ``` sh start.sh --stop - ``` + ``` * Get the latest release From 8402cf1a751a6309ec12bbe918324ec85c0010d9 Mon Sep 17 00:00:00 2001 From: liukai Date: Tue, 14 Sep 2021 14:22:18 +0800 Subject: [PATCH 250/341] Optimize table --- shell.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shell.md b/shell.md index 037f60b82df..bc349ea1cc2 100644 --- a/shell.md +++ b/shell.md @@ -15,13 +15,13 @@ If you already downloaded the `FullNode.jar`, you can use `start.sh` to run it, * Start the service ``` - sh start.sh --run + sh start.sh --run ``` * Stop the service ``` - sh start.sh --stop + sh start.sh --stop ``` * Get the latest release From 89b359a84a17fd93e4e3920ef24a3dd33a7ed47e Mon Sep 17 00:00:00 2001 From: liukai Date: Tue, 14 Sep 2021 14:28:06 +0800 Subject: [PATCH 251/341] Optimize table --- shell.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell.md b/shell.md index bc349ea1cc2..108facc6d21 100644 --- a/shell.md +++ b/shell.md @@ -33,7 +33,7 @@ If you already downloaded the `FullNode.jar`, you can use `start.sh` to run it, * Clone source code and run ``` - sh start -cb --run + sh start.sh -cb --run ``` ## Options From b55fc58315749531b869b65e86286494e42692f8 Mon Sep 17 00:00:00 2001 From: liukai Date: Tue, 14 Sep 2021 15:08:12 +0800 Subject: [PATCH 252/341] modify shell.md example and use steps --- shell.md | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/shell.md b/shell.md index 108facc6d21..cc2f9d00918 100644 --- a/shell.md +++ b/shell.md @@ -4,19 +4,31 @@ Using the `start.sh` script, you can quickly and easily run and build java-tron. -If you already downloaded the `FullNode.jar`, you can use `start.sh` to run it, or if you have not downloaded java-tron code or jar packages, you can use `start.sh` to download the source code, compile, run or get the latest release version in the form of a `jar package ` and run. +If you already downloaded the `FullNode.jar`, you can use `start.sh` to run it, or if you have not downloaded java-tron source code or jar packages, you can use `start.sh` to download the source code, compile, run or get the latest release version in the form of a `jar package ` and run. *** # Usage -## examples +## Use steps +- 1. Make sure `start.sh`, `FullNode.jar`, and the configuration file are in the same directory +- 2. Execute `start.sh` + +## Examples * Start the service + Start java-tron. (`start.sh`, `config.conf` and `FullNode.jar` in the same directory.) + ``` sh start.sh --run ``` + + Start the servive with options. + + ``` + sh start.sh --run -j /data/FullNode.jar -c /data/config.conf -d /data/output-directory + ``` * Stop the service @@ -26,11 +38,13 @@ If you already downloaded the `FullNode.jar`, you can use `start.sh` to run it, * Get the latest release + Get the latest released version of `FullNode.jar` and `config.conf`, then start the `FullNode.jar`. + ``` sh start.sh --release --run ``` -* Clone source code and run +* Clone source code, compile the `Fullnode.jar` and start the service ``` sh start.sh -cb --run @@ -138,14 +152,14 @@ Format: sh start.sh <[--release | -cb]> <--run> [-m ] | [-b ] | [-d | [-dr | --disable-rewrite-manifes]] ``` -Get the latest version. +Get the latest released version. ``` sh start.sh --release --run ``` -You will following file structure after executed the above command and the `FullNode.jar` will be started up. +Following file structure will be generated after executed the above command and the `FullNode.jar` will be started. ``` ├── ... @@ -155,11 +169,11 @@ You will following file structure after executed the above command and the `Full ├── start.sh ``` -**clone the source code and build** +**Clone the source code and build** Get the latest code from master branch of https://github.com/tronprotocol/java-tron and compile. -After using this command, the "FullNode" directory will be created and the compiled file `FullNode.jar` and related configuration files will be copied to this directory +After using this command, the "FullNode" directory will be created, the compiled file `FullNode.jar` and the configuration file will be copied to this directory demo: @@ -200,7 +214,7 @@ Following file structure will be created: ├── start.sh ``` -### 3.rebuild manifest tool +### 3. rebuild manifest tool This tool provides the ability to reformat the manifest based on current database, Enabled by default. From 7c9054d012924bb545d7fa9c567f827b35f93f27 Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Tue, 14 Sep 2021 15:28:03 +0800 Subject: [PATCH 253/341] remove unused import --- framework/src/main/java/org/tron/core/db/Manager.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 53f4c91f1c7..a1a4b415d7a 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -7,12 +7,7 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.google.common.collect.Lists; -import com.google.common.collect.Maps; import com.google.common.primitives.Longs; -import com.google.common.util.concurrent.Futures; -import com.google.common.util.concurrent.ListenableFuture; -import com.google.common.util.concurrent.ListeningExecutorService; -import com.google.common.util.concurrent.MoreExecutors; import com.google.protobuf.ByteString; import java.util.ArrayList; import java.util.Arrays; @@ -36,10 +31,8 @@ import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; -import java.util.stream.LongStream; import javax.annotation.PostConstruct; import lombok.Getter; import lombok.Setter; From aa42def06f191f34a4bae27770e39613dae6cb80 Mon Sep 17 00:00:00 2001 From: liqi <1242201319@qq.com> Date: Tue, 14 Sep 2021 16:51:35 +0800 Subject: [PATCH 254/341] Add jsonrpc test case --- .../common/client/utils/JsonRpcBase.java | 280 ++++++------- .../dailybuild/jsonrpc/Accounts001.java | 371 +++++++++++++----- 2 files changed, 413 insertions(+), 238 deletions(-) diff --git a/framework/src/test/java/stest/tron/wallet/common/client/utils/JsonRpcBase.java b/framework/src/test/java/stest/tron/wallet/common/client/utils/JsonRpcBase.java index 677f731ff55..55ede39790c 100644 --- a/framework/src/test/java/stest/tron/wallet/common/client/utils/JsonRpcBase.java +++ b/framework/src/test/java/stest/tron/wallet/common/client/utils/JsonRpcBase.java @@ -10,12 +10,10 @@ import io.grpc.Status; import io.netty.util.internal.StringUtil; import java.math.BigInteger; -import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; -import java.util.List; import java.util.Optional; -import java.util.Random; +// import java.util.*; + import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpPost; @@ -45,24 +43,22 @@ @Slf4j public class JsonRpcBase { - public final String foundationAccountKey = Configuration.getByPath("testng.conf") - .getString("foundationAccount.key1"); + public final String foundationAccountKey = + Configuration.getByPath("testng.conf").getString("foundationAccount.key1"); public final byte[] foundationAccountAddress = PublicMethed.getFinalAddress(foundationAccountKey); - public static final String jsonRpcOwnerKey = Configuration.getByPath("testng.conf") - .getString("defaultParameter.jsonRpcOwnerKey"); - public static final byte[] jsonRpcOwnerAddress = PublicMethed - .getFinalAddress(jsonRpcOwnerKey); - public static final String jsonRpcOwnerAddressString = PublicMethed - .getAddressString(jsonRpcOwnerKey); - + public static final String jsonRpcOwnerKey = + Configuration.getByPath("testng.conf").getString("defaultParameter.jsonRpcOwnerKey"); + public static final byte[] jsonRpcOwnerAddress = PublicMethed.getFinalAddress(jsonRpcOwnerKey); + public static final String jsonRpcOwnerAddressString = + PublicMethed.getAddressString(jsonRpcOwnerKey); - public static String jsonRpcNode = Configuration.getByPath("testng.conf") - .getStringList("jsonRpcNode.ip.list").get(0); - public static String httpFullNode = Configuration.getByPath("testng.conf") - .getStringList("httpnode.ip.list").get(0); - public static String ethHttpsNode = Configuration.getByPath("testng.conf") - .getStringList("ethHttpsNode.host.list").get(0); + public static String jsonRpcNode = + Configuration.getByPath("testng.conf").getStringList("jsonRpcNode.ip.list").get(0); + public static String httpFullNode = + Configuration.getByPath("testng.conf").getStringList("httpnode.ip.list").get(0); + public static String ethHttpsNode = + Configuration.getByPath("testng.conf").getStringList("ethHttpsNode.host.list").get(0); public ManagedChannel channelFull = null; public WalletGrpc.WalletBlockingStub blockingStubFull = null; @@ -71,11 +67,11 @@ public class JsonRpcBase { public WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubSolidity = null; public WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubPbft = null; - public String fullnode = Configuration.getByPath("testng.conf") - .getStringList("fullnode.ip.list").get(0); + public String fullnode = + Configuration.getByPath("testng.conf").getStringList("fullnode.ip.list").get(0); - public static long maxFeeLimit = Configuration.getByPath("testng.conf") - .getLong("defaultParameter.maxFeeLimit"); + public static long maxFeeLimit = + Configuration.getByPath("testng.conf").getLong("defaultParameter.maxFeeLimit"); public static String trc20AddressByteString; public static String trc20AddressHex; public static String contractAddressFrom58; @@ -88,8 +84,9 @@ public class JsonRpcBase { public static String mint = "mint(uint256,bytes32[9],bytes32[2],bytes32[21])"; public static String transfer = "transfer(bytes32[10][],bytes32[2][],bytes32[9][],bytes32[2],bytes32[21][])"; - public static String burn = "burn(bytes32[10],bytes32[2],uint256,bytes32[2],address," - + "bytes32[3],bytes32[9][],bytes32[21][])"; + public static String burn = + "burn(bytes32[10],bytes32[2],uint256,bytes32[2],address," + + "bytes32[3],bytes32[9][],bytes32[21][])"; public Wallet wallet = new Wallet(); static HttpResponse response; static HttpPost httppost; @@ -99,63 +96,72 @@ public class JsonRpcBase { public static String name = "jsonrpc-test"; public static String jsonRpcAssetId; public static Integer blockNum; + public static Integer blockNumForTrc20; public static String blockNumHex; public static String blockId; public static String txid; public static String trc20Txid; - - /** - * constructor. - */ + /** constructor. */ @BeforeSuite(enabled = true, description = "Deploy json rpc test case resource") public void deployJsonRpcUseResource() throws Exception { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); - channelFull = ManagedChannelBuilder.forTarget(fullnode) - .usePlaintext(true) - .build(); + channelFull = ManagedChannelBuilder.forTarget(fullnode).usePlaintext(true).build(); blockingStubFull = WalletGrpc.newBlockingStub(channelFull); - Assert.assertTrue(PublicMethed.sendcoin(jsonRpcOwnerAddress, 2048000000L, - foundationAccountAddress, foundationAccountKey, blockingStubFull)); + Assert.assertTrue( + PublicMethed.sendcoin( + jsonRpcOwnerAddress, + 2048000000L, + foundationAccountAddress, + foundationAccountKey, + blockingStubFull)); if (PublicMethed.queryAccount(jsonRpcOwnerAddress, blockingStubFull).getAssetV2Count() == 0L) { - Assert.assertTrue(PublicMethed.sendcoin(jsonRpcOwnerAddress, 2048000000L, - foundationAccountAddress, foundationAccountKey, blockingStubFull)); + Assert.assertTrue( + PublicMethed.sendcoin( + jsonRpcOwnerAddress, + 2048000000L, + foundationAccountAddress, + foundationAccountKey, + blockingStubFull)); PublicMethed.waitProduceNextBlock(blockingStubFull); - - - //Create a new Asset Issue - Assert.assertTrue(PublicMethed.createAssetIssue(jsonRpcOwnerAddress, - name, totalSupply, 1, 1, System.currentTimeMillis() + 5000, - System.currentTimeMillis() + 1000000000, 1, - "description", "urlurlurl", - 2000L, 2000L, 1L, 1L, - jsonRpcOwnerKey, blockingStubFull)); - + // Create a new Asset Issue + Assert.assertTrue( + PublicMethed.createAssetIssue( + jsonRpcOwnerAddress, + name, + totalSupply, + 1, + 1, + System.currentTimeMillis() + 5000, + System.currentTimeMillis() + 1000000000, + 1, + "description", + "urlurlurl", + 2000L, + 2000L, + 1L, + 1L, + jsonRpcOwnerKey, + blockingStubFull)); PublicMethed.waitProduceNextBlock(blockingStubFull); } - response = HttpMethed.getAccount(httpFullNode, jsonRpcOwnerAddress); responseContent = HttpMethed.parseResponseContent(response); jsonRpcAssetId = responseContent.getString("asset_issued_ID"); - - deployContract(); triggerContract(); deployTrc20Contract(); } - - - /** - * constructor. - */ + /** constructor. */ public void deployContract() throws Exception { - final Long beforeTokenBalance = PublicMethed.getAssetBalanceByAssetId(ByteString - .copyFromUtf8(jsonRpcAssetId), jsonRpcOwnerKey, blockingStubFull); + final Long beforeTokenBalance = + PublicMethed.getAssetBalanceByAssetId( + ByteString.copyFromUtf8(jsonRpcAssetId), jsonRpcOwnerKey, blockingStubFull); JsonObject param = new JsonObject(); param.addProperty("from", ByteArray.toHexString(jsonRpcOwnerAddress)); @@ -177,25 +183,25 @@ public void deployContract() throws Exception { param.addProperty("tokenValue", 1); JsonArray params = new JsonArray(); params.add(param); - JsonObject requestBody = getJsonRpcBody("buildTransaction",params); + JsonObject requestBody = getJsonRpcBody("buildTransaction", params); response = getJsonRpc(jsonRpcNode, requestBody); responseContent = HttpMethed.parseResponseContent(response); String transactionString = responseContent.getJSONObject("result").getString("transaction"); - String transactionSignString = HttpMethed.gettransactionsign(httpFullNode, - transactionString, jsonRpcOwnerKey); + String transactionSignString = + HttpMethed.gettransactionsign(httpFullNode, transactionString, jsonRpcOwnerKey); responseContent = HttpMethed.parseStringContent(transactionString); final String txid = responseContent.getString("txID"); - response = HttpMethed.broadcastTransaction(httpFullNode, transactionSignString); org.junit.Assert.assertTrue(HttpMethed.verificationResult(response)); HttpMethed.waitToProduceOneBlock(httpFullNode); - Long afterTokenBalance = PublicMethed.getAssetBalanceByAssetId(ByteString - .copyFromUtf8(jsonRpcAssetId), jsonRpcOwnerKey, blockingStubFull); + Long afterTokenBalance = + PublicMethed.getAssetBalanceByAssetId( + ByteString.copyFromUtf8(jsonRpcAssetId), jsonRpcOwnerKey, blockingStubFull); - org.junit.Assert.assertEquals(beforeTokenBalance - afterTokenBalance,1L); + org.junit.Assert.assertEquals(beforeTokenBalance - afterTokenBalance, 1L); logger.info(txid); response = HttpMethed.getTransactionById(httpFullNode, txid); @@ -205,32 +211,28 @@ public void deployContract() throws Exception { contractAddressFrom58 = responseContent.getString("contract_address"); } - /** - * constructor. - */ + /** constructor. */ public void triggerContract() throws Exception { - final Long beforeTokenBalance = PublicMethed.getAssetBalanceByAssetId(ByteString - .copyFromUtf8(jsonRpcAssetId), foundationAccountKey, blockingStubFull); + final Long beforeTokenBalance = + PublicMethed.getAssetBalanceByAssetId( + ByteString.copyFromUtf8(jsonRpcAssetId), foundationAccountKey, blockingStubFull); final Long beforeBalance = HttpMethed.getBalance(httpFullNode, jsonRpcOwnerAddress); JsonObject param = new JsonObject(); - param.addProperty("from", "0x" + ByteArray - .toHexString(jsonRpcOwnerAddress).substring(2)); + param.addProperty("from", "0x" + ByteArray.toHexString(jsonRpcOwnerAddress).substring(2)); param.addProperty("to", "0x" + contractAddressFrom58); + String addressParam = + "000000000000000000000000" + + ByteArray.toHexString(foundationAccountAddress).substring(2); // [0,3) - String addressParam = "000000000000000000000000" + ByteArray - .toHexString(foundationAccountAddress).substring(2);//[0,3) - - String tokenIdParam = "00000000000000000000000000000000000000000000000000000000000" + Integer - .toHexString(Integer.valueOf(jsonRpcAssetId)); + String tokenIdParam = + "00000000000000000000000000000000000000000000000000000000000" + + Integer.toHexString(Integer.valueOf(jsonRpcAssetId)); String tokenValueParam = "0000000000000000000000000000000000000000000000000000000000000001"; String paramString = addressParam + tokenIdParam + tokenValueParam; String selector = "TransferTokenTo(address,trcToken,uint256)"; - - - param.addProperty("data", "0x" + Util.parseMethod(selector, paramString)); param.addProperty("gas", "0x245498"); param.addProperty("value", "0x1389"); @@ -238,31 +240,34 @@ public void triggerContract() throws Exception { param.addProperty("tokenValue", 1); JsonArray params = new JsonArray(); params.add(param); - JsonObject requestBody = getJsonRpcBody("buildTransaction",params); + JsonObject requestBody = getJsonRpcBody("buildTransaction", params); response = getJsonRpc(jsonRpcNode, requestBody); responseContent = HttpMethed.parseResponseContent(response); String transactionString = responseContent.getJSONObject("result").getString("transaction"); logger.info("transactionString : " + transactionString); - String transactionSignString = HttpMethed.gettransactionsign(httpFullNode, - transactionString, jsonRpcOwnerKey); + String transactionSignString = + HttpMethed.gettransactionsign(httpFullNode, transactionString, jsonRpcOwnerKey); responseContent = HttpMethed.parseStringContent(transactionString); txid = responseContent.getString("txID"); - response = HttpMethed.broadcastTransaction(httpFullNode, transactionSignString); + logger.info("response:" + response); + HttpMethed.verificationResult(response); org.junit.Assert.assertTrue(HttpMethed.verificationResult(response)); HttpMethed.waitToProduceOneBlock(httpFullNode); - Long afterTokenBalance = PublicMethed.getAssetBalanceByAssetId(ByteString - .copyFromUtf8(jsonRpcAssetId), foundationAccountKey, blockingStubFull); + Long afterTokenBalance = + PublicMethed.getAssetBalanceByAssetId( + ByteString.copyFromUtf8(jsonRpcAssetId), foundationAccountKey, blockingStubFull); Long afterBalance = HttpMethed.getBalance(httpFullNode, jsonRpcOwnerAddress); - org.junit.Assert.assertEquals(beforeTokenBalance - afterTokenBalance,-1L); + org.junit.Assert.assertEquals(beforeTokenBalance - afterTokenBalance, -1L); org.junit.Assert.assertTrue(beforeBalance - afterBalance >= 5000); - blockNum = (int)(PublicMethed.getTransactionInfoById(txid, blockingStubFull).get() - .getBlockNumber()); + blockNum = + (int) (PublicMethed.getTransactionInfoById(txid, blockingStubFull).get().getBlockNumber()); + PublicMethed.waitProduceNextBlock(blockingStubFull); response = HttpMethed.getBlockByNum(httpFullNode, blockNum); org.junit.Assert.assertEquals(response.getStatusLine().getStatusCode(), 200); responseContent = HttpMethed.parseResponseContent(response); @@ -270,52 +275,71 @@ public void triggerContract() throws Exception { blockId = responseContent.get("blockID").toString(); } - /** - * constructor. - */ - public void deployTrc20Contract() { + /** constructor. */ + public void deployTrc20Contract() throws InterruptedException { String contractName = "shieldTrc20Token"; - String abi = Configuration.getByPath("testng.conf") - .getString("abi.abi_shieldTrc20Token"); - String code = Configuration.getByPath("testng.conf") - .getString("code.code_shieldTrc20Token"); + String abi = Configuration.getByPath("testng.conf").getString("abi.abi_shieldTrc20Token"); + String code = Configuration.getByPath("testng.conf").getString("code.code_shieldTrc20Token"); String constructorStr = "constructor(uint256,string,string)"; String data = totalSupply.toString() + "," + "\"TokenTRC20\"" + "," + "\"zen20\""; logger.info("data:" + data); - deployTrc20Txid = PublicMethed - .deployContractWithConstantParame(contractName, abi, code, constructorStr, data, "", - maxFeeLimit, 0L, 100, null, - jsonRpcOwnerKey, jsonRpcOwnerAddress, blockingStubFull); + deployTrc20Txid = + PublicMethed.deployContractWithConstantParame( + contractName, + abi, + code, + constructorStr, + data, + "", + maxFeeLimit, + 0L, + 100, + null, + jsonRpcOwnerKey, + jsonRpcOwnerAddress, + blockingStubFull); PublicMethed.waitProduceNextBlock(blockingStubFull); logger.info(deployTrc20Txid); - Optional infoById = PublicMethed - .getTransactionInfoById(deployTrc20Txid, blockingStubFull); + Optional infoById = + PublicMethed.getTransactionInfoById(deployTrc20Txid, blockingStubFull); trc20AddressHex = ByteArray.toHexString(infoById.get().getContractAddress().toByteArray()); - byte[] trc20Address = infoById.get().getContractAddress().toByteArray(); String selector = "transfer(address,uint256)"; - String addressParam = "000000000000000000000000" + ByteArray - .toHexString(foundationAccountAddress).substring(2);//[0,3) + String addressParam = + "000000000000000000000000" + + ByteArray.toHexString(foundationAccountAddress).substring(2); // [0,3) String transferValueParam = "0000000000000000000000000000000000000000000000000000000000000001"; String paramString = addressParam + transferValueParam; - - trc20Txid = PublicMethed.triggerContract(trc20Address, selector, paramString, - true, 0, maxFeeLimit, "0",0, - jsonRpcOwnerAddress, jsonRpcOwnerKey, blockingStubFull); - + trc20Txid = + PublicMethed.triggerContract( + trc20Address, + selector, + paramString, + true, + 0, + maxFeeLimit, + "0", + 0, + jsonRpcOwnerAddress, + jsonRpcOwnerKey, + blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + blockNumForTrc20 = + (int) + (PublicMethed.getTransactionInfoById(trc20Txid, blockingStubFull) + .get() + .getBlockNumber()); } - /** - * constructor. - */ - public static HttpResponse getEthHttps(String ethHttpsNode,JsonObject jsonRpcObject) { + /** constructor. */ + public static HttpResponse getEthHttps(String ethHttpsNode, JsonObject jsonRpcObject) { try { String requestUrl = "https://" + ethHttpsNode + "/v3/dfb752dd45204b8daae74249f4653584"; - response = HttpMethed.createConnect(requestUrl,jsonRpcObject); + response = HttpMethed.createConnect(requestUrl, jsonRpcObject); } catch (Exception e) { e.printStackTrace(); httppost.releaseConnection(); @@ -324,16 +348,11 @@ public static HttpResponse getEthHttps(String ethHttpsNode,JsonObject jsonRpcObj return response; } - - - - /** - * constructor. - */ - public static HttpResponse getJsonRpc(String jsonRpcNode,JsonObject jsonRpcObject) { + /** constructor. */ + public static HttpResponse getJsonRpc(String jsonRpcNode, JsonObject jsonRpcObject) { try { String requestUrl = "http://" + jsonRpcNode + "/jsonrpc"; - response = HttpMethed.createConnect(requestUrl,jsonRpcObject); + response = HttpMethed.createConnect(requestUrl, jsonRpcObject); } catch (Exception e) { e.printStackTrace(); httppost.releaseConnection(); @@ -342,24 +361,18 @@ public static HttpResponse getJsonRpc(String jsonRpcNode,JsonObject jsonRpcObjec return response; } - /** - * constructor. - */ + /** constructor. */ public static JsonObject getJsonRpcBody(String method) { return getJsonRpcBody(method, new JsonArray(), 1); } - /** - * constructor. - */ + /** constructor. */ public static JsonObject getJsonRpcBody(String method, JsonArray params) { return getJsonRpcBody(method, params, 1); } - /** - * constructor. - */ - public static JsonObject getJsonRpcBody(String method, JsonArray params,Integer id) { + /** constructor. */ + public static JsonObject getJsonRpcBody(String method, JsonArray params, Integer id) { JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("jsonrpc", "2.0"); jsonObject.addProperty("method", method); @@ -368,7 +381,4 @@ public static JsonObject getJsonRpcBody(String method, JsonArray params,Integer return jsonObject; } - - - } diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java index 9ab52bad429..2f0d2b2a938 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java @@ -4,23 +4,25 @@ import com.alibaba.fastjson.JSONObject; import com.google.gson.JsonArray; import com.google.gson.JsonObject; - -import java.nio.charset.StandardCharsets; +import io.grpc.ManagedChannelBuilder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; - +import java.util.concurrent.TimeUnit; import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpResponse; import org.junit.Assert; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import org.tron.api.GrpcAPI; +import org.tron.api.WalletGrpc; import org.tron.common.utils.ByteArray; import org.tron.protos.Protocol.Block; import stest.tron.wallet.common.client.utils.HttpMethed; - import stest.tron.wallet.common.client.utils.JsonRpcBase; +import stest.tron.wallet.common.client.utils.PublicMethed; @Slf4j public class Accounts001 extends JsonRpcBase { @@ -37,13 +39,20 @@ public class Accounts001 extends JsonRpcBase { String parentHash = null; String txTrieRoot = null; String witnessAddress = null; - String gas = null; String feeLimit = null; List transactionIdList = null; long size = 0; + long gas = 0; long blockTimeStamp = 0; + /** constructor. */ + @BeforeClass(enabled = true) + public void beforeClass() { + channelFull = ManagedChannelBuilder.forTarget(fullnode).usePlaintext(true).build(); + blockingStubFull = WalletGrpc.newBlockingStub(channelFull); + } + @Test(enabled = true, description = "Json rpc api of eth_accounts") public void test01JsonRpcApiTestForEthAccounts() throws Exception { JsonArray params = new JsonArray(); @@ -63,22 +72,23 @@ public void test02JsonRpcApiTestForEthBlockNumber() throws Exception { responseContent = HttpMethed.parseResponseContent(response); responseContent.get("result"); String blockNum = responseContent.getString("result").substring(2); - int blocknum1 = Integer.parseInt(blockNum, 16); + int blocknumFromJsonRpcNode = Integer.parseInt(blockNum, 16); response = HttpMethed.getNowBlock(httpFullNode); responseContent = HttpMethed.parseResponseContent(response); - int blocknum2 = + int blocknumFromHttp = responseContent .getJSONObject("block_header") .getJSONObject("raw_data") .getInteger("number"); - logger.info(String.valueOf(blocknum1)); - logger.info(String.valueOf(blocknum2)); - Assert.assertTrue(Math.abs(blocknum1 - blocknum2) <= 2); + logger.info("blocknumFromJsonRpcNode:" + blocknumFromJsonRpcNode); + logger.info("blocknumFromHttp:" + blocknumFromHttp); + Assert.assertTrue(Math.abs(blocknumFromJsonRpcNode - blocknumFromHttp) <= 3); } @Test(enabled = true, description = "Json rpc api of eth_call") public void test03JsonRpcApiTestForEthCall() throws Exception { JsonObject param = new JsonObject(); + HttpMethed.waitToProduceOneBlock(httpFullNode); param.addProperty("from", ByteArray.toHexString(jsonRpcOwnerAddress)); param.addProperty("to", trc20AddressHex); param.addProperty("gas", "0"); @@ -89,15 +99,16 @@ public void test03JsonRpcApiTestForEthCall() throws Exception { params.add(param); params.add("latest"); JsonObject requestBody = getJsonRpcBody("eth_call", params); + logger.info("params:" + params); response = getJsonRpc(jsonRpcNode, requestBody); responseContent = HttpMethed.parseResponseContent(response); String dataResult = responseContent.getString("result"); Assert.assertEquals( - dataResult, "0x000000000000000000000000000000000000000000000000000" + "00000000000200000000000000000000000000000000000000000" + "00000000000000000000000a546f6b656e5452433230000000000" - + "00000000000000000000000000000000000"); + + "00000000000000000000000000000000000", + dataResult); } @Test(enabled = true, description = "Json rpc api of eth_chainId") @@ -107,13 +118,13 @@ public void test04JsonRpcApiTestForEthChainId() throws Exception { response = getJsonRpc(jsonRpcNode, requestBody); responseContent = HttpMethed.parseResponseContent(response); responseContent.get("result"); - String blockId1 = responseContent.get("result").toString().substring(2); + String blockIdFromJsonRpcNode = responseContent.get("result").toString().substring(2); response = HttpMethed.getBlockByNum(httpFullNode, 0); responseContent = HttpMethed.parseResponseContent(response); - String blockId2 = responseContent.getString("blockID"); - logger.info(blockId1); - logger.info(blockId2); - Assert.assertEquals(blockId1, blockId2); + String blockIdFromHttp = responseContent.getString("blockID"); + logger.info("blockIdFromJsonRpcNode:" + blockIdFromJsonRpcNode); + logger.info("blockIdFromHttp:" + blockIdFromHttp); + Assert.assertEquals(blockIdFromJsonRpcNode, blockIdFromHttp); } @Test(enabled = true, description = "Json rpc api of eth_coinbase") @@ -124,7 +135,25 @@ public void test05JsonRpcApiTestForEthCoinbase() throws Exception { responseContent = HttpMethed.parseResponseContent(response); Assert.assertEquals( - responseContent.getString("result"), "0x41bafb56091591790e00aa05eaddcc7dc1474b5d4b"); + "0x41bafb56091591790e00aa05eaddcc7dc1474b5d4b", responseContent.getString("result")); + } + + @Test(enabled = true, description = "Json rpc api of eth_estimateGas") + public void test06JsonRpcApiTestForEthEstimateGas() throws Exception { + JsonObject param = new JsonObject(); + param.addProperty("from", ByteArray.toHexString(jsonRpcOwnerAddress)); + param.addProperty("to", trc20AddressHex); + param.addProperty("gas", "0x0"); + param.addProperty("gasPrice", "0x0"); + param.addProperty("value", "0x0"); + param.addProperty("data", "0x1249c58b"); + JsonArray params = new JsonArray(); + params.add(param); + JsonObject requestBody = getJsonRpcBody("eth_estimateGas", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String dataResult = responseContent.getString("result"); + Assert.assertEquals("0x147", dataResult); } @Test(enabled = true, description = "Json rpc api of eth_gasPrice") @@ -167,54 +196,8 @@ public void test08JsonRpcApiTestForEthGetBalance() throws Exception { Assert.assertEquals(balance1, balance2); } - @Test(enabled = true, description = "Json rpc api of eth_getBlockTransactionCountByHash") - public void test11JsonRpcApiTestForEthGetBlockTransactionCountByHash() throws Exception { - response = HttpMethed.getNowBlock(httpFullNode); - responseContent = HttpMethed.parseResponseContent(response); - String blockIdHash = responseContent.getString("blockID"); - long blockNum = - responseContent.getJSONObject("block_header").getJSONObject("raw_data").getLong("number"); - logger.info("blockNum:" + blockNum); - JsonArray params = new JsonArray(); - params.add("0x" + blockIdHash); - logger.info("0x" + blockIdHash); - JsonObject requestBody = getJsonRpcBody("eth_getBlockTransactionCountByHash", params); - response = getJsonRpc(jsonRpcNode, requestBody); - responseContent = HttpMethed.parseResponseContent(response); - String transactionNum = responseContent.getString("result").substring(2); - int transactionNum1 = Integer.parseInt(transactionNum, 16); - logger.info(String.valueOf(transactionNum1)); - response = HttpMethed.getTransactionCountByBlocknum(httpFullNode, blockNum); - responseContent = HttpMethed.parseResponseContent(response); - int transactionNum2 = responseContent.getInteger("count"); - logger.info(String.valueOf(transactionNum2)); - Assert.assertEquals(transactionNum1, transactionNum2); - } - - @Test(enabled = true, description = "Json rpc api of eth_getBlockTransactionCountByNumber") - public void test12JsonRpcApiTestForEthGetBlockTransactionCountByNum01() throws Exception { - response = HttpMethed.getNowBlock(httpFullNode); - responseContent = HttpMethed.parseResponseContent(response); - long blockNum = - responseContent.getJSONObject("block_header").getJSONObject("raw_data").getLong("number"); - JsonArray params = new JsonArray(); - params.add(blockNum); - logger.info(String.valueOf(blockNum)); - JsonObject requestBody = getJsonRpcBody("eth_getBlockTransactionCountByNumber", params); - response = getJsonRpc(jsonRpcNode, requestBody); - responseContent = HttpMethed.parseResponseContent(response); - String transactionNum = responseContent.getString("result").substring(2); - int transactionNum1 = Integer.parseInt(transactionNum, 16); - logger.info(String.valueOf(transactionNum1)); - response = HttpMethed.getTransactionCountByBlocknum(httpFullNode, blockNum); - responseContent = HttpMethed.parseResponseContent(response); - int transactionNum2 = responseContent.getInteger("count"); - logger.info(String.valueOf(transactionNum2)); - Assert.assertEquals(transactionNum1, transactionNum2); - } - @Test(enabled = true, description = "Json rpc api of eth_getBlockTransactionCountByNumber") - public void test12JsonRpcApiTestForEthGetBlockTransactionCountByNum02() throws Exception { + public void test09JsonRpcApiTestForEthGetBlockTransactionCountByNum() throws Exception { response = HttpMethed.getNowBlock(httpFullNode); responseContent = HttpMethed.parseResponseContent(response); JsonArray params = new JsonArray(); @@ -233,7 +216,7 @@ public void test12JsonRpcApiTestForEthGetBlockTransactionCountByNum02() throws E } @Test(enabled = true, description = "Json rpc api of eth_getCode") - public void test13JsonRpcApiTestForEthGetCode() throws Exception { + public void test10JsonRpcApiTestForEthGetCode() throws Exception { JsonArray params = new JsonArray(); params.add(contractAddressFrom58); @@ -251,33 +234,60 @@ public void test13JsonRpcApiTestForEthGetCode() throws Exception { Assert.assertEquals(codeFromJsonRpc, codeFromHttp); } - @Test(enabled = false, description = "Json rpc api of eth_getStorageAt") - public void test14JsonRpcApiTestForEthGetStorageAt01() throws Exception { + @Test(enabled = true, description = "Json rpc api of eth_getStorageAt") + public void test11JsonRpcApiTestForEthGetStorageAt01() throws Exception { JsonArray params = new JsonArray(); - params.add("41e5dc01c00136012136e82a5bfda5959110a3231f"); + params.add(contractAddressFrom58); + params.add("0x0"); params.add("latest"); - JsonObject requestBody = getJsonRpcBody("c", params); + JsonObject requestBody = getJsonRpcBody("eth_getStorageAt", params); + logger.info("requestBody:" + requestBody); response = getJsonRpc(jsonRpcNode, requestBody); responseContent = HttpMethed.parseResponseContent(response); - String codeFromJsonRpc = responseContent.getString("result").substring(2); - logger.info(codeFromJsonRpc); - response = - HttpMethed.getContractInfo(httpFullNode, "41e5dc01c00136012136e82a5bfda5959110a3231f"); + String result = responseContent.getString("result").substring(2); + long resultExpect = Long.parseLong(result, 16); + logger.info("result:" + resultExpect); + Assert.assertEquals("1234", String.valueOf(resultExpect)); + } + + @Test(enabled = true, description = "Json rpc api of eth_getStorageAt") + public void test12JsonRpcApiTestForEthGetStorageAt02() throws Exception { + + String address = + "000000000000000000000000" + ByteArray.toHexString(jsonRpcOwnerAddress).substring(2); + String str = address + "0000000000000000000000000000000000000000000000000000000000000001"; + logger.info("str:" + str); + JsonArray paramsForSha3 = new JsonArray(); + paramsForSha3.add(str); + JsonObject requestBodyForSha3 = getJsonRpcBody("web3_sha3", paramsForSha3); + logger.info("requestBodyForSha3:" + requestBodyForSha3); + response = getJsonRpc(jsonRpcNode, requestBodyForSha3); responseContent = HttpMethed.parseResponseContent(response); - String codeFromHttp = responseContent.getString("runtimecode"); - logger.info(codeFromHttp); - Assert.assertEquals(codeFromJsonRpc, codeFromHttp); + logger.info("responseContent:" + responseContent); + String resultForSha3 = responseContent.getString("result"); + logger.info("resultForSha3:" + resultForSha3); + JsonArray params = new JsonArray(); + params.add(contractAddressFrom58); + params.add(resultForSha3); + params.add("latest"); + JsonObject requestBody = getJsonRpcBody("eth_getStorageAt", params); + logger.info("requestBody:" + requestBody); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String result = responseContent.getString("result").substring(2); + logger.info("result:" + result); + logger.info("mapResult:" + Integer.parseInt(result, 16)); + Assert.assertEquals("5678", String.valueOf(Integer.parseInt(result, 16))); } @Test(enabled = true, description = "Json rpc api of eth_getTransactionByBlockNumberAndIndex") - public void test15JsonRpcApiTestForEthGetTransactionByBlockNumberAndIndex() throws Exception { + public void test13JsonRpcApiTestForEthGetTransactionByBlockNumberAndIndex() throws Exception { logger.info("15blockNum:" + blockNum); blockNumHex = "0x" + Integer.toHexString(blockNum); logger.info("blockNumHex:" + blockNumHex); JsonArray params = new JsonArray(); params.add(blockNumHex); - // 判断是块中的第几个交易 indexNum = 0; response = HttpMethed.getBlockByNum(httpFullNode, blockNum); responseContent = HttpMethed.parseResponseContent(response); @@ -341,15 +351,14 @@ public void test15JsonRpcApiTestForEthGetTransactionByBlockNumberAndIndex() thro logger.info("jsonrpcResult:" + jsonrpcResult); response = HttpMethed.getTransactionInfoByBlocknum(httpFullNode, blockNum); logger.info("response:" + response); - gas = jsonrpcResult.get("gas").toString(); - System.out.println(blockNum); List responseContent1 = HttpMethed.parseResponseContentArray(response); logger.info("responseContent1:" + responseContent1); blockTimeStamp = responseContent1.get(0).getLong("blockTimeStamp"); - long gas = 0; + // long gas = 0; for (int i = 0; i < responseContent1.size(); i++) { if (responseContent1.get(i).getString("id").equals(transactionIdList.get(0).substring(2))) { gas = responseContent1.get(i).getJSONObject("receipt").getLong("energy_usage_total"); + logger.info("gas:" + gas); break; } } @@ -407,6 +416,55 @@ public void test15JsonRpcApiTestForEthGetTransactionByBlockNumberAndIndex() thro getBlockByNumResult.getString("signature").substring(66, 130)); } + @Test(enabled = true, description = "Json rpc api of eth_getBlockTransactionCountByHash") + public void test14JsonRpcApiTestForEthGetBlockTransactionCountByHash() throws Exception { + /* response = HttpMethed.getNowBlock(httpFullNode); + responseContent = HttpMethed.parseResponseContent(response); + String blockIdHash = responseContent.getString("blockID");*/ + /* long blockNum = + responseContent.getJSONObject("block_header").getJSONObject("raw_data").getLong("number");*/ + logger.info("blockNum:" + blockNum); + JsonArray params = new JsonArray(); + params.add(blockHash); + logger.info("blockHash:" + blockHash); + JsonObject requestBody = getJsonRpcBody("eth_getBlockTransactionCountByHash", params); + logger.info("requestBody:" + requestBody); + HttpMethed.waitToProduceOneBlock(httpFullNode); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("responseContent:" + responseContent); + String transactionNum = responseContent.getString("result").substring(2); + int transactionNumFromJsonRpcNode = Integer.parseInt(transactionNum, 16); + logger.info("transactionNumFromJsonRpcNode:" + transactionNumFromJsonRpcNode); + response = HttpMethed.getTransactionCountByBlocknum(httpFullNode, blockNum); + responseContent = HttpMethed.parseResponseContent(response); + int transactionNumFromHttp = responseContent.getInteger("count"); + logger.info("transactionNumFromHttp:" + transactionNumFromHttp); + Assert.assertEquals(transactionNumFromHttp, transactionNumFromJsonRpcNode); + } + + @Test(enabled = true, description = "Json rpc api of eth_getBlockTransactionCountByNumber") + public void test15JsonRpcApiTestForEthGetBlockTransactionCountByNum() throws Exception { + JsonArray params = new JsonArray(); + params.add(blockNum); + logger.info(String.valueOf(blockNum)); + JsonObject requestBody = getJsonRpcBody("eth_getBlockTransactionCountByNumber", params); + logger.info("requestBody:" + requestBody); + response = getJsonRpc(jsonRpcNode, requestBody); + logger.info("response:" + response); + HttpMethed.waitToProduceOneBlock(httpFullNode); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("responseContent:" + responseContent); + String transactionNum = responseContent.getString("result").substring(2); + int transactionNum1 = Integer.parseInt(transactionNum, 16); + logger.info(String.valueOf(transactionNum1)); + response = HttpMethed.getTransactionCountByBlocknum(httpFullNode, blockNum); + responseContent = HttpMethed.parseResponseContent(response); + int transactionNum2 = responseContent.getInteger("count"); + logger.info(String.valueOf(transactionNum2)); + Assert.assertEquals(transactionNum1, transactionNum2); + } + @Test(enabled = true, description = "Json rpc api of eth_getTransactionByBlockHashAndIndex") public void test16JsonRpcApiTestForEthGetTransactionByBlockHashAndIndex() throws Exception { JsonArray params = new JsonArray(); @@ -431,16 +489,115 @@ public void test17JsonRpcApiTestForEthGetTransactionByHash() throws Exception { Assert.assertEquals(result, result1); } - @Test(enabled = false, description = "Json rpc api of eth_getTransactionReceipt") + @Test(enabled = true, description = "Json rpc api of eth_getTransactionReceipt") public void test18JsonRpcApiTestForEthGetTransactionReceipt() throws Exception { JsonArray params = new JsonArray(); - params.add(transacionHash); + Thread.sleep(6000); + params.add(trc20Txid); JsonObject requestBody = getJsonRpcBody("eth_getTransactionReceipt", params); + logger.info("requestBody:" + requestBody); response = getJsonRpc(jsonRpcNode, requestBody); + logger.info("response:" + response); responseContent = HttpMethed.parseResponseContent(response); - JSONObject result1 = responseContent.getJSONObject("result"); - logger.info("result:" + result.toString()); - Assert.assertEquals(result, result1); + JSONObject resultFromTransactionReceipt = responseContent.getJSONObject("result"); + logger.info("resultFromTransactionReceipt:" + resultFromTransactionReceipt); + JSONArray logs = resultFromTransactionReceipt.getJSONArray("logs"); + logger.info("logs:" + logs); + logger.info("result:" + resultFromTransactionReceipt.toString()); + response = HttpMethed.getBlockByNum(httpFullNode, blockNumForTrc20); + responseContent = HttpMethed.parseResponseContent(response); + int index = 0; + for (int i = 0; i < responseContent.getJSONArray("transactions").size(); i++) { + if (trc20Txid.equals( + responseContent.getJSONArray("transactions").getJSONObject(i).getString("txID"))) { + index = i; + break; + } + } + + JsonArray paramsForTransactionByBlockNumberAndIndex = new JsonArray(); + paramsForTransactionByBlockNumberAndIndex.add("0x" + Integer.toHexString(blockNumForTrc20)); + paramsForTransactionByBlockNumberAndIndex.add("0x" + Integer.toHexString(index)); + JsonObject requestBody1 = + getJsonRpcBody( + "eth_getTransactionByBlockNumberAndIndex", paramsForTransactionByBlockNumberAndIndex); + response = getJsonRpc(jsonRpcNode, requestBody1); + logger.info("requestBody1:" + requestBody1); + responseContent = HttpMethed.parseResponseContent(response); + JSONObject resultFromTransactionByBlockNumberAndIndex = responseContent.getJSONObject("result"); + logger.info( + "resultFromTransactionByBlockNumberAndIndex:" + resultFromTransactionByBlockNumberAndIndex); + Assert.assertEquals( + resultFromTransactionReceipt.getString("blockHash"), + resultFromTransactionByBlockNumberAndIndex.getString("blockHash")); + Assert.assertEquals( + resultFromTransactionReceipt.getString("blockNumber"), + resultFromTransactionByBlockNumberAndIndex.getString("blockNumber")); + Assert.assertEquals( + resultFromTransactionReceipt.getString("transactionIndex"), + resultFromTransactionByBlockNumberAndIndex.getString("transactionIndex")); + Assert.assertEquals( + resultFromTransactionReceipt.getString("transactionHash"), "0x" + trc20Txid); + Assert.assertEquals( + resultFromTransactionReceipt.getString("from"), + resultFromTransactionByBlockNumberAndIndex.getString("from")); + Assert.assertEquals( + resultFromTransactionReceipt.getString("to"), + resultFromTransactionByBlockNumberAndIndex.getString("to")); + Assert.assertEquals( + resultFromTransactionReceipt.getString("contractAddress").substring(2), + trc20AddressHex.substring(2)); + Assert.assertEquals( + resultFromTransactionReceipt.getString("logsBloom"), + "0x000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000"); + Assert.assertEquals("0x1", resultFromTransactionReceipt.getString("status")); + Assert.assertEquals("0x0", resultFromTransactionReceipt.getString("type")); + logger.info("gas:" + resultFromTransactionByBlockNumberAndIndex.getString("gas")); + Assert.assertEquals( + resultFromTransactionReceipt.getString("gasUsed"), + resultFromTransactionByBlockNumberAndIndex.getString("gas")); + Assert.assertEquals( + resultFromTransactionReceipt.getString("cumulativeGasUsed"), + resultFromTransactionByBlockNumberAndIndex.getString("gas")); + Assert.assertEquals( + logs.getJSONObject(0).getString("logIndex"), "0x" + Integer.toHexString(index)); + Assert.assertEquals(logs.getJSONObject(0).getString("removed"), "false"); + Assert.assertEquals( + logs.getJSONObject(0).getString("blockHash"), + resultFromTransactionReceipt.getString("blockHash")); + Assert.assertEquals( + logs.getJSONObject(0).getString("blockNumber"), + resultFromTransactionReceipt.getString("blockNumber")); + Assert.assertEquals( + logs.getJSONObject(0).getString("transactionIndex"), + resultFromTransactionReceipt.getString("transactionIndex")); + Assert.assertEquals( + logs.getJSONObject(0).getString("transactionHash"), + resultFromTransactionReceipt.getString("transactionHash")); + Assert.assertEquals( + logs.getJSONObject(0).getString("address"), + resultFromTransactionReceipt.getString("contractAddress")); + response = HttpMethed.getTransactionInfoByBlocknum(httpFullNode, blockNumForTrc20); + List responseContent1 = HttpMethed.parseResponseContentArray(response); + logger.info("responseContent1:" + responseContent1); + + response = HttpMethed.getBlockByNum(httpFullNode, blockNumForTrc20); + responseContent = HttpMethed.parseResponseContent(response); + Assert.assertEquals( + logs.getJSONObject(0).getString("data").substring(2), + responseContent1.get(index).getJSONArray("log").getJSONObject(0).getString("data")); + + Assert.assertEquals( + logs.getJSONObject(0).getString("topics").replace("0x", ""), + responseContent1.get(index).getJSONArray("log").getJSONObject(0).getString("topics")); } @Test(enabled = true, description = "Json rpc api of eth_getUncleByBlockHashAndIndex") @@ -501,13 +658,13 @@ public void test23JsonRpcApiTestForEthGetWork() throws Exception { responseContent = HttpMethed.parseResponseContent(response); String result = responseContent.getString("result"); int resultLen = result.length(); - String result1 = result.substring(4, resultLen - 12); + String resultFromJsonRpcNode = result.substring(4, resultLen - 12); response = HttpMethed.getNowBlock(httpFullNode); responseContent = HttpMethed.parseResponseContent(response); - String result2 = responseContent.getString("blockID"); - logger.info(result1); - logger.info(result2); - Assert.assertEquals(result1, result2); + String resultFromHttp = responseContent.getString("blockID"); + logger.info("resultFromJsonRpcNode:" + resultFromJsonRpcNode); + logger.info("resultFromHttp:" + resultFromHttp); + Assert.assertEquals(resultFromJsonRpcNode, resultFromHttp); } @Test(enabled = true, description = "Json rpc api of eth_hashrate") @@ -518,7 +675,7 @@ public void test24JsonRpcApiTestForEthHashRate() throws Exception { responseContent = HttpMethed.parseResponseContent(response); String result = responseContent.getString("result"); logger.info(result); - Assert.assertEquals(result, "0x0"); + Assert.assertEquals("0x0", result); } @Test(enabled = true, description = "Json rpc api of eth_mining") @@ -540,7 +697,6 @@ public void test26JsonRpcApiTestForEthProtocolVersion() throws Exception { responseContent = HttpMethed.parseResponseContent(response); String protocolVersion = responseContent.getString("result").substring(2); Long protocolVersion1 = Long.parseLong(protocolVersion, 16); - System.out.println(protocolVersion1); response = HttpMethed.getNowBlock(httpFullNode); responseContent = HttpMethed.parseResponseContent(response); Long protocolVersion2 = @@ -574,7 +730,6 @@ public void test28JsonRpcApiTestForNetListening() throws Exception { response = HttpMethed.getNodeInfo(httpFullNode); responseContent = HttpMethed.parseResponseContent(response); boolean expect = false; - System.out.println(responseContent); int num = responseContent.getInteger("activeConnectCount"); if (num >= 1) { expect = true; @@ -634,14 +789,12 @@ public void test32JsonRpcApiTestForWeb3Sha3() throws Exception { JsonObject requestBody1 = getJsonRpcBody("web3_sha3", params); response = getEthHttps(ethHttpsNode, requestBody1); responseContent = HttpMethed.parseResponseContent(response); - System.out.println(responseContent); String result1 = responseContent.getString("result"); JsonObject requestBody2 = getJsonRpcBody("web3_sha3", params); response = getJsonRpc(jsonRpcNode, requestBody2); responseContent = HttpMethed.parseResponseContent(response); String result2 = responseContent.getString("result"); Assert.assertEquals(result1, result2); - System.out.println(result2); } @Test(enabled = true, description = "Json rpc api of eth_compileLLL") @@ -844,7 +997,7 @@ public void test45JsonRpcApiTestForEthGetBlockByHash() throws Exception { Assert.assertEquals(getBlockByHashResult.getString("parentHash"), "0x" + parentHash); Assert.assertEquals(getBlockByHashResult.getString("transactionsRoot"), "0x" + txTrieRoot); Assert.assertEquals(getBlockByHashResult.getString("miner"), "0x" + witnessAddress); - Assert.assertEquals(getBlockByHashResult.getString("gasUsed"), gas); + Assert.assertEquals(getBlockByHashResult.getString("gasUsed"), "0x" + Long.toHexString(gas)); Assert.assertEquals( String.valueOf(Long.parseLong(getBlockByHashResult.getString("gasLimit").substring(2), 16)), feeLimit); @@ -853,15 +1006,16 @@ public void test45JsonRpcApiTestForEthGetBlockByHash() throws Exception { blockTimeStamp); final GrpcAPI.NumberMessage message = GrpcAPI.NumberMessage.newBuilder().setNum(blockNum).build(); - Block bl = blockingStubFull.getBlockByNum(message); - logger.info("sizeFromJrpc:" + bl.getSerializedSize()); + HttpMethed.waitToProduceOneBlock(httpFullNode); + Block block = blockingStubFull.getBlockByNum(message); + logger.info("sizeFromJrpc:" + block.getSerializedSize()); logger.info( "sizeFromJsonRPc:" + Long.parseLong(getBlockByHashResult.getString("size").substring(2), 16)); - size = bl.getSerializedSize(); + size = block.getSerializedSize(); Assert.assertEquals( Long.parseLong(getBlockByHashResult.getString("size").substring(2), 16), - bl.getSerializedSize()); + block.getSerializedSize()); Long.parseLong(getBlockByHashResult.getString("timestamp").substring(2), 16); JSONArray transactionId = getBlockByHashResult.getJSONArray("transactions"); @@ -911,13 +1065,14 @@ public void test46JsonRpcApiTestForEthGetBlockByNumber() throws Exception { Assert.assertEquals(getBlockByHashResult.getString("parentHash"), "0x" + parentHash); Assert.assertEquals(getBlockByHashResult.getString("transactionsRoot"), "0x" + txTrieRoot); Assert.assertEquals(getBlockByHashResult.getString("miner"), "0x" + witnessAddress); - Assert.assertEquals(getBlockByHashResult.getString("gasUsed"), gas); + Assert.assertEquals(getBlockByHashResult.getString("gasUsed"), "0x" + Long.toHexString(gas)); Assert.assertEquals( String.valueOf(Long.parseLong(getBlockByHashResult.getString("gasLimit").substring(2), 16)), feeLimit); Assert.assertEquals( Long.parseLong(getBlockByHashResult.getString("timestamp").substring(2), 16), blockTimeStamp); + logger.info("size:" + size); Assert.assertEquals( Long.parseLong(getBlockByHashResult.getString("size").substring(2), 16), size); @@ -954,4 +1109,14 @@ public void test46JsonRpcApiTestForEthGetBlockByNumber() throws Exception { transactionInfoListFromGetBlockByHash, transactionInfoListFromTransactionByBlockNumberAndIndex); } + + /** + * constructor. + */ + @AfterClass + public void shutdown() throws InterruptedException { + if (channelFull != null) { + channelFull.shutdown().awaitTermination(5, TimeUnit.SECONDS); + } + } } From 8ce2318d5c87229449818ef892e24a8b93376369 Mon Sep 17 00:00:00 2001 From: liukai Date: Tue, 14 Sep 2021 18:17:54 +0800 Subject: [PATCH 255/341] modify shell.md example and use steps --- shell.md | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/shell.md b/shell.md index cc2f9d00918..57fc62f7390 100644 --- a/shell.md +++ b/shell.md @@ -10,15 +10,11 @@ If you already downloaded the `FullNode.jar`, you can use `start.sh` to run it, # Usage -## Use steps -- 1. Make sure `start.sh`, `FullNode.jar`, and the configuration file are in the same directory -- 2. Execute `start.sh` -## Examples -* Start the service +## Examples - Start java-tron. (`start.sh`, `config.conf` and `FullNode.jar` in the same directory.) +* Start the `FullNode.jar` (`start.sh`, `config.conf` and `FullNode.jar` in the same directory.) ``` sh start.sh --run @@ -29,27 +25,27 @@ If you already downloaded the `FullNode.jar`, you can use `start.sh` to run it, ``` sh start.sh --run -j /data/FullNode.jar -c /data/config.conf -d /data/output-directory ``` - -* Stop the service + +* Stop the `FullNode.jar` ``` sh start.sh --stop ``` -* Get the latest release - - Get the latest released version of `FullNode.jar` and `config.conf`, then start the `FullNode.jar`. +* Get the latest version of `FullNode.jar` and start it ``` sh start.sh --release --run ``` - -* Clone source code, compile the `Fullnode.jar` and start the service + +* Clone the source code, compile `java-tron`, and generate `FullNode.jar` and start it ``` sh start.sh -cb --run ``` + + ## Options ### Service operation From d06acd0a58a4c61d495c8969672be45b9420ad73 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Tue, 14 Sep 2021 18:41:44 +0800 Subject: [PATCH 256/341] feat: add transactionIndex, cumulativeEnergyUsed to TransactionLogTrigger, add blockHash to ContractTrigger --- .../tron/common/logsfilter/TriggerConfig.java | 5 +++ .../trigger/ContractLogTrigger.java | 17 ++++++++ .../logsfilter/trigger/ContractTrigger.java | 4 ++ .../trigger/TransactionLogTrigger.java | 6 +++ .../common/logsfilter/EventPluginLoader.java | 10 +++++ .../capsule/ContractTriggerCapsule.java | 13 ++++++ .../capsule/TransactionLogTriggerCapsule.java | 36 +++++++++++++++- .../java/org/tron/core/config/args/Args.java | 5 +++ .../main/java/org/tron/core/db/Manager.java | 42 ++++++++++++------- 9 files changed, 122 insertions(+), 16 deletions(-) diff --git a/common/src/main/java/org/tron/common/logsfilter/TriggerConfig.java b/common/src/main/java/org/tron/common/logsfilter/TriggerConfig.java index 3ef6291b028..c09b2657731 100644 --- a/common/src/main/java/org/tron/common/logsfilter/TriggerConfig.java +++ b/common/src/main/java/org/tron/common/logsfilter/TriggerConfig.java @@ -17,9 +17,14 @@ public class TriggerConfig { @Setter private String topic; + @Getter + @Setter + private boolean redundancy; + public TriggerConfig() { triggerName = ""; enabled = false; topic = ""; + redundancy = false; } } \ No newline at end of file diff --git a/common/src/main/java/org/tron/common/logsfilter/trigger/ContractLogTrigger.java b/common/src/main/java/org/tron/common/logsfilter/trigger/ContractLogTrigger.java index 5f8830bb932..758c5290692 100644 --- a/common/src/main/java/org/tron/common/logsfilter/trigger/ContractLogTrigger.java +++ b/common/src/main/java/org/tron/common/logsfilter/trigger/ContractLogTrigger.java @@ -24,4 +24,21 @@ public ContractLogTrigger() { super(); setTriggerName(Trigger.CONTRACTLOG_TRIGGER_NAME); } + + public ContractLogTrigger(ContractEventTrigger eventTrigger) { + super(); + setTriggerName(Trigger.CONTRACTLOG_TRIGGER_NAME); + + setRawData(eventTrigger.getRawData()); + setLatestSolidifiedBlockNumber(eventTrigger.getLatestSolidifiedBlockNumber()); + setRemoved(eventTrigger.isRemoved()); + setUniqueId(eventTrigger.getUniqueId()); + setTransactionId(eventTrigger.getTransactionId()); + setContractAddress(eventTrigger.getContractAddress()); + setOriginAddress(eventTrigger.getOriginAddress()); + setCallerAddress(""); + setCreatorAddress(eventTrigger.getCreatorAddress()); + setBlockNumber(eventTrigger.getBlockNumber()); + setTimeStamp(eventTrigger.getTimeStamp()); + } } diff --git a/common/src/main/java/org/tron/common/logsfilter/trigger/ContractTrigger.java b/common/src/main/java/org/tron/common/logsfilter/trigger/ContractTrigger.java index ed783990419..60380e1fa5f 100644 --- a/common/src/main/java/org/tron/common/logsfilter/trigger/ContractTrigger.java +++ b/common/src/main/java/org/tron/common/logsfilter/trigger/ContractTrigger.java @@ -57,6 +57,10 @@ public class ContractTrigger extends Trigger { @Setter private Long blockNumber; + @Getter + @Setter + private String blockHash; + /** * true if the transaction has been revoked */ diff --git a/common/src/main/java/org/tron/common/logsfilter/trigger/TransactionLogTrigger.java b/common/src/main/java/org/tron/common/logsfilter/trigger/TransactionLogTrigger.java index 6c4858b5591..7f701b42ab7 100644 --- a/common/src/main/java/org/tron/common/logsfilter/trigger/TransactionLogTrigger.java +++ b/common/src/main/java/org/tron/common/logsfilter/trigger/TransactionLogTrigger.java @@ -11,6 +11,9 @@ public class TransactionLogTrigger extends Trigger { private String transactionId; @Getter @Setter + private int transactionIndex; + @Getter + @Setter private String blockHash; @Getter @Setter @@ -29,6 +32,9 @@ public class TransactionLogTrigger extends Trigger { private long energyUsageTotal; @Getter @Setter + private long cumulativeEnergyUsed; + @Getter + @Setter private long netUsage; @Getter @Setter diff --git a/framework/src/main/java/org/tron/common/logsfilter/EventPluginLoader.java b/framework/src/main/java/org/tron/common/logsfilter/EventPluginLoader.java index 81cb01684fc..52e1ed6b295 100644 --- a/framework/src/main/java/org/tron/common/logsfilter/EventPluginLoader.java +++ b/framework/src/main/java/org/tron/common/logsfilter/EventPluginLoader.java @@ -50,6 +50,8 @@ public class EventPluginLoader { private boolean contractLogTriggerEnable = false; + private boolean contractLogTriggerRedundancy = false; + private boolean solidityEventTriggerEnable = false; private boolean solidityLogTriggerEnable = false; @@ -277,8 +279,12 @@ private void setSingleTriggerConfig(TriggerConfig triggerConfig) { .equalsIgnoreCase(triggerConfig.getTriggerName())) { if (triggerConfig.isEnabled()) { contractLogTriggerEnable = true; + if (triggerConfig.isRedundancy()) { + contractLogTriggerRedundancy = true; + } } else { contractLogTriggerEnable = false; + contractLogTriggerRedundancy = false; } if (!useNativeQueue) { @@ -356,6 +362,10 @@ public synchronized boolean isContractLogTriggerEnable() { return contractLogTriggerEnable; } + public synchronized boolean isContractLogTriggerRedundancy() { + return contractLogTriggerRedundancy; + } + private void setPluginTopic(int eventType, String topic) { eventListeners.forEach(listener -> listener.setTopic(eventType, topic)); } diff --git a/framework/src/main/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsule.java b/framework/src/main/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsule.java index 80e588d9a17..237ffce5181 100644 --- a/framework/src/main/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsule.java +++ b/framework/src/main/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsule.java @@ -36,6 +36,10 @@ public void setLatestSolidifiedBlockNumber(long latestSolidifiedBlockNumber) { contractTrigger.setLatestSolidifiedBlockNumber(latestSolidifiedBlockNumber); } + public void setBlockHash(String blockHash) { + contractTrigger.setBlockHash(blockHash); + } + @Override public void processTrigger() { ContractTrigger event; @@ -136,6 +140,15 @@ public void processTrigger() { .offer((ContractEventTrigger) event); } + // enable process contractEvent as contractLog + if (EventPluginLoader.getInstance().isContractLogTriggerEnable() + && EventPluginLoader.getInstance().isContractLogTriggerRedundancy()) { + ContractLogTrigger logTrigger = new ContractLogTrigger((ContractEventTrigger) event); + logTrigger.setTopicList(logInfo.getHexTopics()); + logTrigger.setData(logInfo.getHexData()); + + EventPluginLoader.getInstance().postContractLogTrigger(logTrigger); + } } else { if (EventPluginLoader.getInstance().isContractLogTriggerEnable()) { EventPluginLoader.getInstance().postContractLogTrigger((ContractLogTrigger) event); diff --git a/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java b/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java index d478ad1898e..83a920640b6 100644 --- a/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java +++ b/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java @@ -1,7 +1,9 @@ package org.tron.common.logsfilter.capsule; +import static org.tron.protos.Protocol.Transaction.Contract.ContractType.CreateSmartContract; import static org.tron.protos.Protocol.Transaction.Contract.ContractType.TransferAssetContract; import static org.tron.protos.Protocol.Transaction.Contract.ContractType.TransferContract; +import static org.tron.protos.Protocol.Transaction.Contract.ContractType.TriggerSmartContract; import com.google.protobuf.Any; import com.google.protobuf.ByteString; @@ -24,6 +26,8 @@ import org.tron.protos.Protocol; import org.tron.protos.contract.AssetIssueContractOuterClass.TransferAssetContract; import org.tron.protos.contract.BalanceContract.TransferContract; +import org.tron.protos.contract.SmartContractOuterClass.CreateSmartContract; +import org.tron.protos.contract.SmartContractOuterClass.TriggerSmartContract; @Slf4j public class TransactionLogTriggerCapsule extends TriggerCapsule { @@ -32,7 +36,8 @@ public class TransactionLogTriggerCapsule extends TriggerCapsule { @Setter private TransactionLogTrigger transactionLogTrigger; - public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule blockCapsule) { + public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule blockCapsule, + int index, long cumulativeEnergyUsed) { transactionLogTrigger = new TransactionLogTrigger(); if (Objects.nonNull(blockCapsule)) { transactionLogTrigger.setBlockHash(blockCapsule.getBlockId().toString()); @@ -43,6 +48,8 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule transactionLogTrigger.setData(Hex.toHexString(trxCapsule .getInstance().getRawData().getData().toByteArray())); + transactionLogTrigger.setTransactionIndex(index); + TransactionTrace trxTrace = trxCapsule.getTrxTrace(); //result @@ -109,6 +116,27 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule } transactionLogTrigger.setAssetAmount(contractTransfer.getAmount()); } + } else if (contract.getType() == TriggerSmartContract) { + TriggerSmartContract triggerSmartContract = contractParameter + .unpack(TriggerSmartContract.class); + + if (Objects.nonNull(triggerSmartContract.getOwnerAddress())) { + transactionLogTrigger.setFromAddress( + StringUtil.encode58Check(triggerSmartContract.getOwnerAddress().toByteArray())); + } + + if (Objects.nonNull(triggerSmartContract.getContractAddress())) { + transactionLogTrigger.setToAddress(StringUtil + .encode58Check(triggerSmartContract.getContractAddress().toByteArray())); + } + } else if (contract.getType() == CreateSmartContract) { + CreateSmartContract createSmartContract = contractParameter + .unpack(CreateSmartContract.class); + + if (Objects.nonNull(createSmartContract.getOwnerAddress())) { + transactionLogTrigger.setFromAddress( + StringUtil.encode58Check(createSmartContract.getOwnerAddress().toByteArray())); + } } } catch (Exception e) { logger.error("failed to load transferAssetContract, error'{}'", e); @@ -116,15 +144,19 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule } } + long energyUsageTotal = 0; // receipt if (Objects.nonNull(trxTrace) && Objects.nonNull(trxTrace.getReceipt())) { + energyUsageTotal = trxTrace.getReceipt().getEnergyUsageTotal(); + transactionLogTrigger.setEnergyFee(trxTrace.getReceipt().getEnergyFee()); transactionLogTrigger.setOriginEnergyUsage(trxTrace.getReceipt().getOriginEnergyUsage()); - transactionLogTrigger.setEnergyUsageTotal(trxTrace.getReceipt().getEnergyUsageTotal()); + transactionLogTrigger.setEnergyUsageTotal(energyUsageTotal); transactionLogTrigger.setNetUsage(trxTrace.getReceipt().getNetUsage()); transactionLogTrigger.setNetFee(trxTrace.getReceipt().getNetFee()); transactionLogTrigger.setEnergyUsage(trxTrace.getReceipt().getEnergyUsage()); } + transactionLogTrigger.setCumulativeEnergyUsed(cumulativeEnergyUsed + energyUsageTotal); // program result if (Objects.nonNull(trxTrace) && Objects.nonNull(trxTrace.getRuntime()) && Objects diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index 05818d4689c..750546c41d3 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -964,6 +964,11 @@ private static TriggerConfig createTriggerConfig(ConfigObject triggerObject) { String topic = triggerObject.get("topic").unwrapped().toString(); triggerConfig.setTopic(topic); + if (triggerObject.containsKey("redundancy")) { + String redundancy = triggerObject.get("redundancy").unwrapped().toString(); + triggerConfig.setRedundancy("true".equalsIgnoreCase(redundancy)); + } + return triggerConfig; } diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 53f4c91f1c7..eb48aa594ae 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -1201,7 +1201,12 @@ public TransactionInfo processTransaction(final TransactionCapsule trxCap, Block .buildTransactionInfoInstance(trxCap, blockCap, trace); // if event subscribe is enabled, post contract triggers to queue - postContractTrigger(trace, false); + String blockHash = ""; + if (Objects.nonNull(blockCap)) { + blockHash = blockCap.getBlockId().toString(); + } + postContractTrigger(trace, false, blockHash); + Contract contract = trxCap.getInstance().getRawData().getContract(0); if (isMultiSignTransaction(trxCap.getInstance())) { ownerAddressSet.add(ByteArray.toHexString(TransactionCapsule.getOwner(contract))); @@ -1733,21 +1738,28 @@ private void postBlockTrigger(final BlockCapsule newBlock) { } } - for (TransactionCapsule e : newBlock.getTransactions()) { - postTransactionTrigger(e, newBlock); + if (eventPluginLoaded && EventPluginLoader.getInstance().isTransactionLogTriggerEnable()) { + long cumulativeEnergyUsed = 0; + List transactionCapsuleList = newBlock.getTransactions(); + for (int i = 0; i < transactionCapsuleList.size(); i++) { + cumulativeEnergyUsed += postTransactionTrigger(transactionCapsuleList.get(i), newBlock, i, + cumulativeEnergyUsed); + } } } - private void postTransactionTrigger(final TransactionCapsule trxCap, - final BlockCapsule blockCap) { - if (eventPluginLoaded && EventPluginLoader.getInstance().isTransactionLogTriggerEnable()) { - TransactionLogTriggerCapsule trx = new TransactionLogTriggerCapsule(trxCap, blockCap); - trx.setLatestSolidifiedBlockNumber(getDynamicPropertiesStore() - .getLatestSolidifiedBlockNum()); - if (!triggerCapsuleQueue.offer(trx)) { - logger.info("too many triggers, transaction trigger lost: {}", trxCap.getTransactionId()); - } + // return energyUsageTotal of the current transaction + private long postTransactionTrigger(final TransactionCapsule trxCap, + final BlockCapsule blockCap, int index, long cumulativeEnergyUsed) { + TransactionLogTriggerCapsule trx = new TransactionLogTriggerCapsule(trxCap, blockCap, + index, cumulativeEnergyUsed); + trx.setLatestSolidifiedBlockNumber(getDynamicPropertiesStore() + .getLatestSolidifiedBlockNum()); + if (!triggerCapsuleQueue.offer(trx)) { + logger.info("too many triggers, transaction trigger lost: {}", trxCap.getTransactionId()); } + + return trx.getTransactionLogTrigger().getEnergyUsageTotal(); } private void reOrgContractTrigger() { @@ -1759,7 +1771,7 @@ private void reOrgContractTrigger() { BlockCapsule oldHeadBlock = chainBaseManager.getBlockById( getDynamicPropertiesStore().getLatestBlockHeaderHash()); for (TransactionCapsule trx : oldHeadBlock.getTransactions()) { - postContractTrigger(trx.getTrxTrace(), true); + postContractTrigger(trx.getTrxTrace(), true, oldHeadBlock.getBlockId().toString()); } } catch (BadItemException | ItemNotFoundException e) { logger.error("block header hash does not exist or is bad: {}", @@ -1768,7 +1780,7 @@ private void reOrgContractTrigger() { } } - private void postContractTrigger(final TransactionTrace trace, boolean remove) { + private void postContractTrigger(final TransactionTrace trace, boolean remove, String blockHash) { boolean isContractTriggerEnable = EventPluginLoader.getInstance() .isContractEventTriggerEnable() || EventPluginLoader .getInstance().isContractLogTriggerEnable(); @@ -1783,6 +1795,8 @@ private void postContractTrigger(final TransactionTrace trace, boolean remove) { contractTriggerCapsule.getContractTrigger().setRemoved(remove); contractTriggerCapsule.setLatestSolidifiedBlockNumber(getDynamicPropertiesStore() .getLatestSolidifiedBlockNum()); + contractTriggerCapsule.setBlockHash(blockHash); + if (!triggerCapsuleQueue.offer(contractTriggerCapsule)) { logger .info("too many triggers, contract log trigger lost: {}", trigger.getTransactionId()); From 5f0d3fcb629de03deb587a72c4d340e23a7f4f72 Mon Sep 17 00:00:00 2001 From: liqi <1242201319@qq.com> Date: Tue, 14 Sep 2021 18:52:53 +0800 Subject: [PATCH 257/341] Add testcase --- .../common/client/utils/HttpMethed.java | 41 +++++++++ .../dailybuild/http/HttpRateLimite001.java | 84 ++++++++++--------- 2 files changed, 84 insertions(+), 41 deletions(-) diff --git a/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java b/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java index 65d49ef3ed4..ca85af28d01 100644 --- a/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java +++ b/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java @@ -17,6 +17,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; @@ -1414,6 +1415,22 @@ public static HttpResponse listNodes(String httpNode) { return response; } + + /** + * constructor. + */ + public static HttpResponse getStatsInfo(String httpNode) { + try { + String requestUrl = "http://" + httpNode + "/monitor/getstatsinfo"; + response = createConnectForGet(requestUrl); + } catch (Exception e) { + e.printStackTrace(); + httppost.releaseConnection(); + return null; + } + return response; + } + /** * constructor. */ @@ -2734,6 +2751,30 @@ public static HttpResponse createConnect(String url, JsonObject requestBody) { return response; } + + /** + * constructor. + */ + public static HttpResponse createConnectForGet(String url) { + try { + httpClient.getParams() + .setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, connectionTimeout); + httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, soTimeout); + HttpGet httppost; + httppost = new HttpGet(url); + httppost.setHeader("Content-type", "application/json; charset=utf-8"); + httppost.setHeader("Connection", "Close"); + + logger.info(httppost.toString()); + response = httpClient.execute(httppost); + } catch (Exception e) { + e.printStackTrace(); + httppost.releaseConnection(); + return null; + } + return response; + } + /** * constructor. */ diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpRateLimite001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpRateLimite001.java index de48777db11..90c46bb4ab6 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpRateLimite001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpRateLimite001.java @@ -17,19 +17,19 @@ @Slf4j public class HttpRateLimite001 { - private final String testKey002 = Configuration.getByPath("testng.conf") - .getString("foundationAccount.key1"); + private final String testKey002 = + Configuration.getByPath("testng.conf").getString("foundationAccount.key1"); private final byte[] fromAddress = PublicMethed.getFinalAddress(testKey002); private JSONObject responseContent; private HttpResponse response; - private String httpnode = Configuration.getByPath("testng.conf").getStringList("httpnode.ip.list") - .get(0); - private String httpSoliditynode = Configuration.getByPath("testng.conf") - .getStringList("httpnode.ip.list").get(3); - private String realHttpSoliditynode = Configuration.getByPath("testng.conf") - .getStringList("httpnode.ip.list").get(2); - private String httpPbftNode = Configuration.getByPath("testng.conf") - .getStringList("httpnode.ip.list").get(4); + private String httpnode = + Configuration.getByPath("testng.conf").getStringList("httpnode.ip.list").get(0); + private String httpSoliditynode = + Configuration.getByPath("testng.conf").getStringList("httpnode.ip.list").get(3); + private String realHttpSoliditynode = + Configuration.getByPath("testng.conf").getStringList("httpnode.ip.list").get(2); + private String httpPbftNode = + Configuration.getByPath("testng.conf").getStringList("httpnode.ip.list").get(4); @BeforeSuite public void beforeSuite() { @@ -37,17 +37,11 @@ public void beforeSuite() { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); } - /** - * constructor. - */ - + /** constructor. */ @BeforeClass - public void beforeClass() { - } + public void beforeClass() {} - /** - * constructor. - */ + /** constructor. */ @Test(enabled = true, description = "Rate limit QpsStrategy for ListWitness interface") public void test1QpsStrategyForListWitnessInterface() { Long startTimeStamp = System.currentTimeMillis(); @@ -60,9 +54,7 @@ public void test1QpsStrategyForListWitnessInterface() { Assert.assertTrue(endTimesStap - startTimeStamp > 4000); } - /** - * constructor. - */ + /** constructor. */ @Test(enabled = true, description = "Rate limit IpQpsStrategy for ListNodes interface") public void test2IpQpsStrategyForListNodesInterface() { Long startTimeStamp = System.currentTimeMillis(); @@ -75,11 +67,12 @@ public void test2IpQpsStrategyForListNodesInterface() { Assert.assertTrue(endTimesStap - startTimeStamp > 4000); } - /** - * constructor. - */ - @Test(enabled = true, description = "Rate limit IpQpsStrategy for GetBlockByLatestNumOnSolidity " - + "interface on fullnode's solidity service") + /** constructor. */ + @Test( + enabled = true, + description = + "Rate limit IpQpsStrategy for GetBlockByLatestNumOnSolidity " + + "interface on fullnode's solidity service") public void test3IpQpsStrategyForGetBlockByLatestNumOnSolidityInterface() { Long startTimeStamp = System.currentTimeMillis(); Integer repeatTimes = 0; @@ -92,11 +85,11 @@ public void test3IpQpsStrategyForGetBlockByLatestNumOnSolidityInterface() { Assert.assertTrue(endTimesStap - startTimeStamp > 4000); } - /** - * constructor. - */ - @Test(enabled = true, description = "Rate limit QpsStrategy for getBlockByNum " - + "interface on fullnode's solidity service") + /** constructor. */ + @Test( + enabled = true, + description = + "Rate limit QpsStrategy for getBlockByNum " + "interface on fullnode's solidity service") public void test4QpsStrategyForgetBlockByNumResourceInterfaceOnFullnodeSolidityService() { Long startTimeStamp = System.currentTimeMillis(); Integer repeatTimes = 0; @@ -109,8 +102,12 @@ public void test4QpsStrategyForgetBlockByNumResourceInterfaceOnFullnodeSolidityS Assert.assertTrue(endTimesStap - startTimeStamp > 4000); } - @Test(enabled = false, description = "Rate limit QpsStrategy for " - + "getTransactionsFromThisFromSolidity " + "interface on real solidity") + @Test( + enabled = false, + description = + "Rate limit QpsStrategy for " + + "getTransactionsFromThisFromSolidity " + + "interface on real solidity") public void test6QpsStrategyForgetTransactionsToThisFromSolidity() { Long startTimeStamp = System.currentTimeMillis(); Integer repeatTimes = 0; @@ -123,12 +120,17 @@ public void test6QpsStrategyForgetTransactionsToThisFromSolidity() { Assert.assertTrue(endTimesStap - startTimeStamp > 4000); } + @Test(enabled = true, description = "Verify getstatsinfo Interface has been disabled") + public void test7GetStatsInfo() { + response = HttpMethed.getStatsInfo(httpnode); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("responseContent:" + responseContent); + String resultForGetstatsinfo = responseContent.getString("Error"); + logger.info("resultForGetstatsinfo:" + resultForGetstatsinfo); + Assert.assertEquals(resultForGetstatsinfo, "this API is unavailable due to config"); + } - /** - * constructor. - */ - + /** constructor. */ @AfterClass - public void shutdown() throws InterruptedException { - } -} \ No newline at end of file + public void shutdown() throws InterruptedException {} +} From 6fcf0852e5f7cd295f50702da76fe0c0f1023584 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Tue, 14 Sep 2021 19:18:58 +0800 Subject: [PATCH 258/341] feat: set blockHash to ContractTrigger --- .../org/tron/common/logsfilter/trigger/ContractLogTrigger.java | 1 + .../tron/common/logsfilter/capsule/ContractTriggerCapsule.java | 1 + 2 files changed, 2 insertions(+) diff --git a/common/src/main/java/org/tron/common/logsfilter/trigger/ContractLogTrigger.java b/common/src/main/java/org/tron/common/logsfilter/trigger/ContractLogTrigger.java index 758c5290692..e3b591230f4 100644 --- a/common/src/main/java/org/tron/common/logsfilter/trigger/ContractLogTrigger.java +++ b/common/src/main/java/org/tron/common/logsfilter/trigger/ContractLogTrigger.java @@ -40,5 +40,6 @@ public ContractLogTrigger(ContractEventTrigger eventTrigger) { setCreatorAddress(eventTrigger.getCreatorAddress()); setBlockNumber(eventTrigger.getBlockNumber()); setTimeStamp(eventTrigger.getTimeStamp()); + setBlockHash(eventTrigger.getBlockHash()); } } diff --git a/framework/src/main/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsule.java b/framework/src/main/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsule.java index 237ffce5181..674ab69cbf9 100644 --- a/framework/src/main/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsule.java +++ b/framework/src/main/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsule.java @@ -127,6 +127,7 @@ public void processTrigger() { event.setCreatorAddress(contractTrigger.getCreatorAddress()); event.setBlockNumber(contractTrigger.getBlockNumber()); event.setTimeStamp(contractTrigger.getTimeStamp()); + event.setBlockHash(contractTrigger.getBlockHash()); if (matchFilter(contractTrigger)) { if (isEvent) { From b0f14ed8af9368f59fb26d8f5a482097b0ee9891 Mon Sep 17 00:00:00 2001 From: liqi <1242201319@qq.com> Date: Wed, 15 Sep 2021 11:38:43 +0800 Subject: [PATCH 259/341] fix testcase --- .../dailybuild/jsonrpc/Accounts001.java | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java index 2f0d2b2a938..0799fa01d79 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java @@ -135,7 +135,7 @@ public void test05JsonRpcApiTestForEthCoinbase() throws Exception { responseContent = HttpMethed.parseResponseContent(response); Assert.assertEquals( - "0x41bafb56091591790e00aa05eaddcc7dc1474b5d4b", responseContent.getString("result")); + "0x410be88a918d74d0dfd71dc84bd4abf036d0562991", responseContent.getString("result")); } @Test(enabled = true, description = "Json rpc api of eth_estimateGas") @@ -245,6 +245,7 @@ public void test11JsonRpcApiTestForEthGetStorageAt01() throws Exception { logger.info("requestBody:" + requestBody); response = getJsonRpc(jsonRpcNode, requestBody); responseContent = HttpMethed.parseResponseContent(response); + logger.info("11responseContent:" + responseContent); String result = responseContent.getString("result").substring(2); long resultExpect = Long.parseLong(result, 16); logger.info("result:" + resultExpect); @@ -275,8 +276,9 @@ public void test12JsonRpcApiTestForEthGetStorageAt02() throws Exception { logger.info("requestBody:" + requestBody); response = getJsonRpc(jsonRpcNode, requestBody); responseContent = HttpMethed.parseResponseContent(response); + logger.info("12responseContent:" + responseContent); String result = responseContent.getString("result").substring(2); - logger.info("result:" + result); + logger.info("12result:" + result); logger.info("mapResult:" + Integer.parseInt(result, 16)); Assert.assertEquals("5678", String.valueOf(Integer.parseInt(result, 16))); } @@ -418,11 +420,6 @@ public void test13JsonRpcApiTestForEthGetTransactionByBlockNumberAndIndex() thro @Test(enabled = true, description = "Json rpc api of eth_getBlockTransactionCountByHash") public void test14JsonRpcApiTestForEthGetBlockTransactionCountByHash() throws Exception { - /* response = HttpMethed.getNowBlock(httpFullNode); - responseContent = HttpMethed.parseResponseContent(response); - String blockIdHash = responseContent.getString("blockID");*/ - /* long blockNum = - responseContent.getJSONObject("block_header").getJSONObject("raw_data").getLong("number");*/ logger.info("blockNum:" + blockNum); JsonArray params = new JsonArray(); params.add(blockHash); @@ -1030,6 +1027,10 @@ public void test45JsonRpcApiTestForEthGetBlockByHash() throws Exception { @Test(enabled = true, description = "Json rpc api of eth_getBlockByNumber params is true") public void test46JsonRpcApiTestForEthGetBlockByNumber() throws Exception { + + response = HttpMethed.getBlockByNum(httpFullNode, blockNum); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("46getBlockByNum:" + responseContent); JsonArray params = new JsonArray(); params.add(blockNumHex); logger.info("46blockNumHex:" + blockNumHex); @@ -1037,21 +1038,21 @@ public void test46JsonRpcApiTestForEthGetBlockByNumber() throws Exception { JsonObject requestBody = getJsonRpcBody("eth_getBlockByNumber", params); response = getJsonRpc(jsonRpcNode, requestBody); responseContent = HttpMethed.parseResponseContent(response); - JSONObject getBlockByHashResult = responseContent.getJSONObject("result"); - logger.info("getBlockByHashResult:" + getBlockByHashResult); - - Assert.assertNull(getBlockByHashResult.getString("nonce")); - Assert.assertNull(getBlockByHashResult.getString("sha3Uncles")); - Assert.assertNull(getBlockByHashResult.getString("receiptsRoot")); - Assert.assertNull(getBlockByHashResult.getString("difficulty")); - Assert.assertNull(getBlockByHashResult.getString("totalDifficulty")); - Assert.assertNull(getBlockByHashResult.getString("extraData")); - Assert.assertNull(getBlockByHashResult.getString("baseFeePerGas")); - Assert.assertNull(getBlockByHashResult.getString("mixHash")); - Assert.assertEquals(getBlockByHashResult.getString("uncles"), new ArrayList<>().toString()); - Assert.assertEquals(getBlockByHashResult.getString("stateRoot"), "0x"); + JSONObject getBlockByNumberResult = responseContent.getJSONObject("result"); + logger.info("getBlockByHashResult:" + getBlockByNumberResult); + + Assert.assertNull(getBlockByNumberResult.getString("nonce")); + Assert.assertNull(getBlockByNumberResult.getString("sha3Uncles")); + Assert.assertNull(getBlockByNumberResult.getString("receiptsRoot")); + Assert.assertNull(getBlockByNumberResult.getString("difficulty")); + Assert.assertNull(getBlockByNumberResult.getString("totalDifficulty")); + Assert.assertNull(getBlockByNumberResult.getString("extraData")); + Assert.assertNull(getBlockByNumberResult.getString("baseFeePerGas")); + Assert.assertNull(getBlockByNumberResult.getString("mixHash")); + Assert.assertEquals(getBlockByNumberResult.getString("uncles"), new ArrayList<>().toString()); + Assert.assertEquals(getBlockByNumberResult.getString("stateRoot"), "0x"); Assert.assertEquals( - getBlockByHashResult.getString("logsBloom"), + getBlockByNumberResult.getString("logsBloom"), "0x00000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000" + "00000000000000000000000000000000000000000000000000000000000000000000000" @@ -1060,23 +1061,24 @@ public void test46JsonRpcApiTestForEthGetBlockByNumber() throws Exception { + "0000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000"); - Assert.assertEquals(getBlockByHashResult.getString("number"), blockNumHex); - Assert.assertEquals(getBlockByHashResult.getString("hash"), "0x" + bid); - Assert.assertEquals(getBlockByHashResult.getString("parentHash"), "0x" + parentHash); - Assert.assertEquals(getBlockByHashResult.getString("transactionsRoot"), "0x" + txTrieRoot); - Assert.assertEquals(getBlockByHashResult.getString("miner"), "0x" + witnessAddress); - Assert.assertEquals(getBlockByHashResult.getString("gasUsed"), "0x" + Long.toHexString(gas)); + Assert.assertEquals(getBlockByNumberResult.getString("number"), blockNumHex); + Assert.assertEquals(getBlockByNumberResult.getString("hash"), "0x" + bid); + Assert.assertEquals(getBlockByNumberResult.getString("parentHash"), "0x" + parentHash); + Assert.assertEquals(getBlockByNumberResult.getString("transactionsRoot"), "0x" + txTrieRoot); + Assert.assertEquals(getBlockByNumberResult.getString("miner"), "0x" + witnessAddress); + Assert.assertEquals(getBlockByNumberResult.getString("gasUsed"), "0x" + Long.toHexString(gas)); Assert.assertEquals( - String.valueOf(Long.parseLong(getBlockByHashResult.getString("gasLimit").substring(2), 16)), + String.valueOf( + Long.parseLong(getBlockByNumberResult.getString("gasLimit").substring(2), 16)), feeLimit); Assert.assertEquals( - Long.parseLong(getBlockByHashResult.getString("timestamp").substring(2), 16), + Long.parseLong(getBlockByNumberResult.getString("timestamp").substring(2), 16), blockTimeStamp); logger.info("size:" + size); Assert.assertEquals( - Long.parseLong(getBlockByHashResult.getString("size").substring(2), 16), size); + Long.parseLong(getBlockByNumberResult.getString("size").substring(2), 16), size); - JSONArray transactionsList = getBlockByHashResult.getJSONArray("transactions"); + JSONArray transactionsList = getBlockByNumberResult.getJSONArray("transactions"); logger.info("transactionsList:" + transactionsList); List transactionInfoListFromGetBlockByHash = new ArrayList<>(); if (transactionsList.size() > 0) { @@ -1110,9 +1112,7 @@ public void test46JsonRpcApiTestForEthGetBlockByNumber() throws Exception { transactionInfoListFromTransactionByBlockNumberAndIndex); } - /** - * constructor. - */ + /** constructor. */ @AfterClass public void shutdown() throws InterruptedException { if (channelFull != null) { From ed8b6ca0a354fb0e025c9f42e88f95a7bf987d6c Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 15 Sep 2021 12:19:53 +0800 Subject: [PATCH 260/341] feat: add redundancy config to solidity log trigger --- .../common/logsfilter/EventPluginLoader.java | 10 ++++++++++ .../capsule/ContractTriggerCapsule.java | 16 +++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/framework/src/main/java/org/tron/common/logsfilter/EventPluginLoader.java b/framework/src/main/java/org/tron/common/logsfilter/EventPluginLoader.java index 52e1ed6b295..8a8abd13fd0 100644 --- a/framework/src/main/java/org/tron/common/logsfilter/EventPluginLoader.java +++ b/framework/src/main/java/org/tron/common/logsfilter/EventPluginLoader.java @@ -56,6 +56,8 @@ public class EventPluginLoader { private boolean solidityLogTriggerEnable = false; + private boolean solidityLogTriggerRedundancy = false; + private boolean solidityTriggerEnable = false; private FilterQuery filterQuery; @@ -315,8 +317,12 @@ private void setSingleTriggerConfig(TriggerConfig triggerConfig) { .equalsIgnoreCase(triggerConfig.getTriggerName())) { if (triggerConfig.isEnabled()) { solidityLogTriggerEnable = true; + if (triggerConfig.isRedundancy()) { + solidityLogTriggerRedundancy = true; + } } else { solidityLogTriggerEnable = false; + solidityLogTriggerRedundancy = false; } if (!useNativeQueue) { setPluginTopic(Trigger.SOLIDITY_LOG_TRIGGER, triggerConfig.getTopic()); @@ -350,6 +356,10 @@ public synchronized boolean isSolidityLogTriggerEnable() { return solidityLogTriggerEnable; } + public synchronized boolean isSolidityLogTriggerRedundancy() { + return solidityLogTriggerRedundancy; + } + public synchronized boolean isTransactionLogTriggerEnable() { return transactionLogTriggerEnable; } diff --git a/framework/src/main/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsule.java b/framework/src/main/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsule.java index 674ab69cbf9..3c83ae9f33d 100644 --- a/framework/src/main/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsule.java +++ b/framework/src/main/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsule.java @@ -142,13 +142,23 @@ public void processTrigger() { } // enable process contractEvent as contractLog - if (EventPluginLoader.getInstance().isContractLogTriggerEnable() - && EventPluginLoader.getInstance().isContractLogTriggerRedundancy()) { + if ((EventPluginLoader.getInstance().isContractLogTriggerEnable() + && EventPluginLoader.getInstance().isContractLogTriggerRedundancy()) + || (EventPluginLoader.getInstance().isSolidityLogTriggerEnable() + && EventPluginLoader.getInstance().isSolidityLogTriggerRedundancy())) { ContractLogTrigger logTrigger = new ContractLogTrigger((ContractEventTrigger) event); logTrigger.setTopicList(logInfo.getHexTopics()); logTrigger.setData(logInfo.getHexData()); - EventPluginLoader.getInstance().postContractLogTrigger(logTrigger); + if (EventPluginLoader.getInstance().isContractLogTriggerRedundancy()) { + EventPluginLoader.getInstance().postContractLogTrigger(logTrigger); + } + + if (EventPluginLoader.getInstance().isSolidityLogTriggerRedundancy()) { + Args.getSolidityContractLogTriggerMap().computeIfAbsent(event + .getBlockNumber(), listBlk -> new LinkedBlockingQueue()) + .offer(logTrigger); + } } } else { if (EventPluginLoader.getInstance().isContractLogTriggerEnable()) { From 0c9cf28332538aa0082b5fa76b0a4dd6a4dace48 Mon Sep 17 00:00:00 2001 From: liqi <1242201319@qq.com> Date: Wed, 15 Sep 2021 16:05:34 +0800 Subject: [PATCH 261/341] fix testcase for 45 --- .../wallet/dailybuild/jsonrpc/Accounts001.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java index 0799fa01d79..524ab5ddcf2 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java @@ -40,6 +40,7 @@ public class Accounts001 extends JsonRpcBase { String txTrieRoot = null; String witnessAddress = null; String feeLimit = null; + String accountStateRoot = null; List transactionIdList = null; long size = 0; @@ -961,6 +962,14 @@ public void test44JsonRpcApiTestForEthSubmitHashrate() throws Exception { @Test(enabled = true, description = "Json rpc api of eth_getBlockByHash params is false") public void test45JsonRpcApiTestForEthGetBlockByHash() throws Exception { + response = HttpMethed.getBlockByNum(httpFullNode, blockNum); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("45getBlockByNumFromHttp:" + responseContent); + accountStateRoot = + responseContent + .getJSONObject("block_header") + .getJSONObject("raw_data") + .getString("accountStateRoot"); JsonArray params = new JsonArray(); params.add(blockHash); params.add(false); @@ -978,7 +987,8 @@ public void test45JsonRpcApiTestForEthGetBlockByHash() throws Exception { Assert.assertNull(getBlockByHashResult.getString("baseFeePerGas")); Assert.assertNull(getBlockByHashResult.getString("mixHash")); Assert.assertEquals(getBlockByHashResult.getString("uncles"), new ArrayList<>().toString()); - Assert.assertEquals(getBlockByHashResult.getString("stateRoot"), "0x"); + Assert.assertEquals(getBlockByHashResult.getString("stateRoot"), "0x" + accountStateRoot); + Assert.assertEquals( getBlockByHashResult.getString("logsBloom"), "0x00000000000000000000000000000000000000000000000000" @@ -1028,9 +1038,6 @@ public void test45JsonRpcApiTestForEthGetBlockByHash() throws Exception { @Test(enabled = true, description = "Json rpc api of eth_getBlockByNumber params is true") public void test46JsonRpcApiTestForEthGetBlockByNumber() throws Exception { - response = HttpMethed.getBlockByNum(httpFullNode, blockNum); - responseContent = HttpMethed.parseResponseContent(response); - logger.info("46getBlockByNum:" + responseContent); JsonArray params = new JsonArray(); params.add(blockNumHex); logger.info("46blockNumHex:" + blockNumHex); @@ -1050,7 +1057,7 @@ public void test46JsonRpcApiTestForEthGetBlockByNumber() throws Exception { Assert.assertNull(getBlockByNumberResult.getString("baseFeePerGas")); Assert.assertNull(getBlockByNumberResult.getString("mixHash")); Assert.assertEquals(getBlockByNumberResult.getString("uncles"), new ArrayList<>().toString()); - Assert.assertEquals(getBlockByNumberResult.getString("stateRoot"), "0x"); + Assert.assertEquals(getBlockByNumberResult.getString("stateRoot"), "0x" + accountStateRoot); Assert.assertEquals( getBlockByNumberResult.getString("logsBloom"), "0x00000000000000000000000000000000000000000000000000000000000000000000" From 80d932c02a3be8adfb0ca7bf6bcdee7e621cddc3 Mon Sep 17 00:00:00 2001 From: sophiawang <1975054324@qq.com> Date: Wed, 15 Sep 2021 17:14:30 +0800 Subject: [PATCH 262/341] add test cases --- ...ureForJavatron440.java => EthGrammer.java} | 146 ++++- .../newGrammar/EthGrammer02.java | 539 ++++++++++++++++++ .../resources/soliditycode/EthGrammer.sol | 191 +++++++ .../resources/soliditycode/EthGrammer02.sol | 43 ++ .../soliditycode/NewFeatureJavatron440.sol | 87 --- 5 files changed, 905 insertions(+), 101 deletions(-) rename framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/{NewFeatureForJavatron440.java => EthGrammer.java} (71%) create mode 100644 framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/EthGrammer02.java create mode 100644 framework/src/test/resources/soliditycode/EthGrammer.sol create mode 100644 framework/src/test/resources/soliditycode/EthGrammer02.sol delete mode 100644 framework/src/test/resources/soliditycode/NewFeatureJavatron440.sol diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/NewFeatureForJavatron440.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/EthGrammer.java similarity index 71% rename from framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/NewFeatureForJavatron440.java rename to framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/EthGrammer.java index ce97a61f484..bb49f07e1f1 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/NewFeatureForJavatron440.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/EthGrammer.java @@ -27,7 +27,7 @@ @Slf4j -public class NewFeatureForJavatron440 { +public class EthGrammer { private final String testNetAccountKey = Configuration.getByPath("testng.conf") .getString("foundationAccount.key2"); @@ -70,7 +70,7 @@ public void beforeClass() { testNetAccountAddress, testNetAccountKey, blockingStubFull)); PublicMethed.waitProduceNextBlock(blockingStubFull); - String filePath = "src/test/resources/soliditycode/NewFeatureJavatron440.sol"; + String filePath = "src/test/resources/soliditycode/EthGrammer.sol"; String contractName = "C"; HashMap retMap = PublicMethed.getBycodeAbi(filePath, contractName); @@ -217,10 +217,9 @@ public void test04CallEnergy() { PublicMethed.waitProduceNextBlock(blockingStubFull); Optional info = PublicMethed.getTransactionInfoById(txid, blockingStubFull); - System.out.println("0000000" + info.toString()); Protocol.Account testAccount = PublicMethed.queryAccountByAddress(transferToAddress, blockingStubFull); - System.out.println("testAccount: " + testAccount.toString()); + logger.info("testAccount: " + testAccount.toString()); Assert.assertEquals(1, info.get().getResultValue()); Assert.assertEquals(Protocol.Transaction.Result.contractResult.REVERT, info.get().getReceipt().getResult()); @@ -261,11 +260,9 @@ public void test05Create2AddressCallEnergy() { false, 0, temMaxLimitFee, contractExcAddress, contractExcKey, blockingStubFull); PublicMethed.waitProduceNextBlock(blockingStubFull); info = PublicMethed.getTransactionInfoById(txid, blockingStubFull); - System.out.println("0000000" + info.get().toString()); Protocol.Account testAccount = PublicMethed.queryAccountByAddress(transferToAddress, blockingStubFull); - System.out.println("testAccount: " + testAccount.toString()); Assert.assertEquals("", testAccount.toString()); Assert.assertEquals(1, info.get().getResultValue()); Assert.assertEquals(Protocol.Transaction.Result.contractResult.REVERT, @@ -308,11 +305,9 @@ public void test06Create2AddressDelegateCallEnergy() { false, 0, temMaxLimitFee, contractExcAddress, contractExcKey, blockingStubFull); PublicMethed.waitProduceNextBlock(blockingStubFull); info = PublicMethed.getTransactionInfoById(txid, blockingStubFull); - System.out.println("0000000" + info.toString()); Protocol.Account testAccount = PublicMethed.queryAccountByAddress(transferToAddress, blockingStubFull); - System.out.println("testAccount: " + testAccount.toString()); Assert.assertEquals("", testAccount.toString()); Assert.assertEquals(1, info.get().getResultValue()); Assert.assertEquals(Protocol.Transaction.Result.contractResult.REVERT, @@ -354,11 +349,9 @@ public void test07Create2AddressCallFunctionEnergy() { false, 0, temMaxLimitFee, contractExcAddress, contractExcKey, blockingStubFull); PublicMethed.waitProduceNextBlock(blockingStubFull); info = PublicMethed.getTransactionInfoById(txid, blockingStubFull); - System.out.println("0000000" + info.toString()); Protocol.Account testAccount = PublicMethed.queryAccountByAddress(transferToAddress, blockingStubFull); - System.out.println("testAccount: " + testAccount.toString()); Assert.assertEquals("", testAccount.toString()); Assert.assertEquals(1, info.get().getResultValue()); Assert.assertEquals(Protocol.Transaction.Result.contractResult.REVERT, @@ -368,20 +361,145 @@ public void test07Create2AddressCallFunctionEnergy() { } // - @Test(enabled = false, description = "test get Ripemd160") + @Test(enabled = true, description = "test get Ripemd160 input is 123") public void test08getRipemd160() { - String args = "0000000000000000000000000000000000000000000000000000000000000064"; + String args = "\"123\""; GrpcAPI.TransactionExtention transactionExtention = PublicMethed .triggerConstantContractForExtention(contractC, - "getRipemd160(bytes)", args, true, + "getRipemd160(string)", args, false, 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); String result = ByteArray.toHexString(transactionExtention.getConstantResult(0).toByteArray()); - System.out.println("result: " + result); Assert.assertEquals(true, transactionExtention.getResult().getResult()); Assert.assertEquals("SUCESS", transactionExtention.getTransaction().getRet(0).getRet().toString()); + Assert.assertEquals("e3431a8e0adbf96fd140103dc6f63a3f8fa343ab000000000000000000000000", result); } + @Test(enabled = true, description = "test get Ripemd160 input is empty") + public void test09getRipemd160() { + String args = "\"\""; + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(contractC, + "getRipemd160(string)", args, false, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + String result = ByteArray.toHexString(transactionExtention.getConstantResult(0).toByteArray()); + Assert.assertEquals(true, transactionExtention.getResult().getResult()); + Assert.assertEquals("SUCESS", + transactionExtention.getTransaction().getRet(0).getRet().toString()); + Assert.assertEquals("9c1185a5c5e9fc54612808977ee8f548b2258d31000000000000000000000000", result); + } + + @Test(enabled = true, description = "test get Ripemd160 input length is greater than 256") + public void test10getRipemd160() { + String args = "\"111111111111ddddddddddddd0x0000000000000000000000008b56a0602cc81fb0" + + "b99bce992b3198c0bab181ac111111111111ddddddddddddd0x0000000000000000000000008b56" + + "a0602cc81fb0b99bce992b3198c0bab181ac%^$#0000008b56a0602cc81fb0b99bce99" + + "2b3198c0bab181ac%^$#0000008b56a0602cc81fb0b99bce992b3198c0bab181ac%^$#\""; + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(contractC, + "getRipemd160(string)", args, false, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + String result = ByteArray.toHexString(transactionExtention.getConstantResult(0).toByteArray()); + Assert.assertEquals(true, transactionExtention.getResult().getResult()); + Assert.assertEquals("SUCESS", + transactionExtention.getTransaction().getRet(0).getRet().toString()); + Assert.assertEquals("173c283ebcbad0e1c623a5c0f6813cb663338369000000000000000000000000", result); + } + + @Test(enabled = true, description = "test get Ripemd160 input is string " + + "and do not convert to bytes") + public void test11getRipemd160Str() { + String args = "\"data\""; + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(contractC, + "getRipemd160Str(string)", args, false, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + String result = ByteArray.toHexString(transactionExtention.getConstantResult(0).toByteArray()); + Assert.assertEquals(true, transactionExtention.getResult().getResult()); + Assert.assertEquals("SUCESS", + transactionExtention.getTransaction().getRet(0).getRet().toString()); + Assert.assertEquals("cd43325b85172ca28e96785d0cb4832fd62cdf43000000000000000000000000", result); + } + + @Test(enabled = true, description = "test get Ripemd160 input is string and " + + "do not convert to bytes") + public void test12getRipemd160Str() { + String args = "\"000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000\""; + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(contractC, + "getRipemd160Str(string)", args, false, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + String result = ByteArray.toHexString(transactionExtention.getConstantResult(0).toByteArray()); + Assert.assertEquals(true, transactionExtention.getResult().getResult()); + Assert.assertEquals("SUCESS", + transactionExtention.getTransaction().getRet(0).getRet().toString()); + Assert.assertEquals("efe2df697b79b5eb73a577251ce3911078811fa4000000000000000000000000", result); + } + + @Test(enabled = true, description = "test blake2f") + public void test13getBlak2f() { + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(contractC, + "callF()", "#", false, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + String result = ByteArray.toHexString(transactionExtention.getConstantResult(0).toByteArray()); + Assert.assertEquals(true, transactionExtention.getResult().getResult()); + Assert.assertEquals("SUCESS", + transactionExtention.getTransaction().getRet(0).getRet().toString()); + Assert.assertEquals("ba80a53f981c4d0d6a2797b69f12f6e94c212f14685ac" + + "4b74b12bb6fdbffa2d17d87c5392aab792dc252d5de4533cc9518d38aa8dbf1925ab92386edd4009923", + result); + + } + + @Test(enabled = true, description = "when call create2, stack depth will be checked" + + "if stack depth is greater than 64, then create command will revert" + + "but run environment can not compute so much, so the actual result is time out") + public void test14FixCreate2StackDepth() { + String methedStr = "fixCreate2StackDepth(uint256)"; + String argsStr = "123"; + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(contractD, + methedStr, argsStr, false, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + logger.info("transactionExtention: " + transactionExtention.toString()); + String message = ByteArray.toStr(transactionExtention.getResult().getMessage().toByteArray()); + Assert.assertTrue(message.contains("CPU timeout")); + /*int interCount = transactionExtention.getInternalTransactionsCount(); + int createCount = 0; + for(int i=0;i= 15 && createCount <= 64);*/ + } + + @Test(enabled = true, description = "when call create, stack depth will be checked." + + "if stack depth is greater than 64, then create command will revert" + + "but run environment can not compute so much, so the actual result is time out") + public void test15FixCreateStackDepth() { + + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(contractD, + "fixCreateStackDepth()", "#", false, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + String message = ByteArray.toStr(transactionExtention.getResult().getMessage().toByteArray()); + logger.info("transactionExtention: " + transactionExtention.toString()); + Assert.assertTrue(message.contains("CPU timeout")); + /*int interCount = transactionExtention.getInternalTransactionsCount(); + int createCount = 0; + for(int i=0;i= 15 && createCount <= 64);*/ + + } + + /** * constructor. */ diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/EthGrammer02.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/EthGrammer02.java new file mode 100644 index 00000000000..9fde98e2ac6 --- /dev/null +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/EthGrammer02.java @@ -0,0 +1,539 @@ +package stest.tron.wallet.dailybuild.tvmnewcommand.newGrammar; + +import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; +import java.util.HashMap; +import java.util.Optional; +import java.util.concurrent.TimeUnit; +import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Test; +import org.tron.api.GrpcAPI; +import org.tron.api.WalletGrpc; +import org.tron.common.crypto.ECKey; +import org.tron.common.utils.ByteArray; +import org.tron.common.utils.Utils; +import org.tron.core.Wallet; +import org.tron.protos.Protocol; +import org.tron.protos.contract.SmartContractOuterClass; +import stest.tron.wallet.common.client.Configuration; +import stest.tron.wallet.common.client.Parameter; +import stest.tron.wallet.common.client.utils.PublicMethed; + + + +@Slf4j +public class EthGrammer02 { + + private final String testNetAccountKey = Configuration.getByPath("testng.conf") + .getString("foundationAccount.key2"); + private final byte[] testNetAccountAddress = PublicMethed.getFinalAddress(testNetAccountKey); + byte[] contractD = null; + ECKey ecKey1 = new ECKey(Utils.getRandom()); + byte[] contractExcAddress = ecKey1.getAddress(); + String contractExcKey = ByteArray.toHexString(ecKey1.getPrivKeyBytes()); + private Long maxFeeLimit = Configuration.getByPath("testng.conf") + .getLong("defaultParameter.maxFeeLimit"); + private ManagedChannel channelFull = null; + private WalletGrpc.WalletBlockingStub blockingStubFull = null; + + private String fullnode = Configuration.getByPath("testng.conf") + .getStringList("fullnode.ip.list").get(0); + + int salt = 11; + + @BeforeSuite + public void beforeSuite() { + Wallet wallet = new Wallet(); + Wallet.setAddressPreFixByte(Parameter.CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); + } + + /** + * constructor. + */ + + @BeforeClass(enabled = true) + public void beforeClass() { + PublicMethed.printAddress(contractExcKey); + channelFull = ManagedChannelBuilder.forTarget(fullnode) + .usePlaintext(true) + .build(); + blockingStubFull = WalletGrpc.newBlockingStub(channelFull); + + Assert.assertTrue(PublicMethed + .sendcoin(contractExcAddress, 300100_000_000L, + testNetAccountAddress, testNetAccountKey, blockingStubFull)); + PublicMethed.waitProduceNextBlock(blockingStubFull); + + String filePath = "src/test/resources/soliditycode/EthGrammer02.sol"; + String contractName = "D"; + HashMap retMap = PublicMethed.getBycodeAbi(filePath, contractName); + + String code = retMap.get("byteCode").toString(); + String abi = retMap.get("abI").toString(); + contractD = PublicMethed.deployContract(contractName, abi, code, "", maxFeeLimit, + 500000000L, 100, null, contractExcKey, + contractExcAddress, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + SmartContractOuterClass.SmartContract smartContract = PublicMethed.getContract(contractD, + blockingStubFull); + Assert.assertNotNull(smartContract.getAbi()); + } + + @Test(enabled = true, description = "can not deploy contract with bytecode ef") + public void test16forbiddenBytecodeStartWithEf() { + String code = "60ef60005360016000f3"; + String abi = "[{\"inputs\":[],\"stateMutability\":\"payable\",\"type\":\"constructor\"}]"; + String txid = PublicMethed.deployContractAndGetTransactionInfoById("test", + abi, code, "", maxFeeLimit, + 500000000L, 100, null, contractExcKey, + contractExcAddress, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + Optional info = + PublicMethed.getTransactionInfoById(txid, blockingStubFull); + logger.info("info: " + info.get().toString()); + Assert.assertEquals(1, info.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.INVALID_CODE, + info.get().getReceipt().getResult()); + Assert.assertEquals("invalid code: must not begin with 0xef".toLowerCase(), + ByteArray.toStr(info.get().getResMessage().toByteArray()).toLowerCase()); + } + + @Test(enabled = true, description = "can not deploy contract with bytecode ef00") + public void test17forbiddenBytecodeStartWithEf() { + String code = "60ef60005360026000f3"; + String abi = "[{\"inputs\":[],\"stateMutability\":\"payable\",\"type\":\"constructor\"}]"; + String txid = PublicMethed.deployContractAndGetTransactionInfoById("test", + abi, code, "", maxFeeLimit, 500000000L, 100, null, contractExcKey, + contractExcAddress, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + Optional info = + PublicMethed.getTransactionInfoById(txid, blockingStubFull); + logger.info("info: " + info.get().toString()); + Assert.assertEquals(1, info.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.INVALID_CODE, + info.get().getReceipt().getResult()); + Assert.assertEquals("invalid code: must not begin with 0xef".toLowerCase(), + ByteArray.toStr(info.get().getResMessage().toByteArray()).toLowerCase()); + } + + @Test(enabled = true, description = "can not deploy contract with bytecode ef0000") + public void test18forbiddenBytecodeStartWithEf() { + String code = "60ef60005360036000f3"; + String abi = "[{\"inputs\":[],\"stateMutability\":\"payable\",\"type\":\"constructor\"}]"; + String txid = PublicMethed.deployContractAndGetTransactionInfoById("test", abi, + code, "", maxFeeLimit, 500000000L, 100, null, contractExcKey, + contractExcAddress, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + Optional info = + PublicMethed.getTransactionInfoById(txid, blockingStubFull); + logger.info("info: " + info.get().toString()); + Assert.assertEquals(1, info.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.INVALID_CODE, + info.get().getReceipt().getResult()); + Assert.assertEquals("invalid code: must not begin with 0xef".toLowerCase(), + ByteArray.toStr(info.get().getResMessage().toByteArray()).toLowerCase()); + } + + @Test(enabled = true, description = "can not deploy contract with bytecode" + + " ef00000000000000000000000000000000000000000000000000000000000000") + public void test19forbiddenBytecodeStartWithEf() { + String code = "60ef60005360206000f3"; + String abi = "[{\"inputs\":[],\"stateMutability\":\"payable\",\"type\":\"constructor\"}]"; + String txid = PublicMethed.deployContractAndGetTransactionInfoById("test", abi, + code, "", maxFeeLimit, 500000000L, 100, null, contractExcKey, + contractExcAddress, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + Optional info = + PublicMethed.getTransactionInfoById(txid, blockingStubFull); + logger.info("info: " + info.get().toString()); + Assert.assertEquals(1, info.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.INVALID_CODE, + info.get().getReceipt().getResult()); + Assert.assertEquals("invalid code: must not begin with 0xef".toLowerCase(), + ByteArray.toStr(info.get().getResMessage().toByteArray()).toLowerCase()); + } + + @Test(enabled = true, description = "can deploy contract with bytecode fe") + public void test20forbiddenBytecodeStartWithEf() { + String code = "60fe60005360016000f3"; + String abi = "[{\"inputs\":[],\"stateMutability\":\"payable\",\"type\":\"constructor\"}]"; + String txid = PublicMethed.deployContractAndGetTransactionInfoById("test", abi, + code, "", maxFeeLimit, 500000000L, 100, null, contractExcKey, + contractExcAddress, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + Optional info = + PublicMethed.getTransactionInfoById(txid, blockingStubFull); + logger.info("info: " + info.get().toString()); + Assert.assertEquals(0, info.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.SUCCESS, + info.get().getReceipt().getResult()); + } + + @Test(enabled = true, description = "can not deploy contract by create with bytecode ef") + public void test21forbiddenBytecodeStartWithEf() { + String methedStr = "createDeployEf(bytes)"; + String argsStr = "\"0x60ef60005360016000f3\""; + String txid = PublicMethed.triggerContract(contractD, methedStr, argsStr, + false, 0, maxFeeLimit, contractExcAddress, + contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + Optional info = + PublicMethed.getTransactionInfoById(txid, blockingStubFull); + Assert.assertEquals(1, info.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.REVERT, + info.get().getReceipt().getResult()); + } + + @Test(enabled = true, description = "can not deploy contract by create with bytecode ef00") + public void test22forbiddenBytecodeStartWithEf() { + String methedStr = "createDeployEf(bytes)"; + String argsStr = "\"0x60ef60005360026000f3\""; + String txid = PublicMethed.triggerContract(contractD, methedStr, argsStr, + false, 0, maxFeeLimit, contractExcAddress, + contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + Optional info = + PublicMethed.getTransactionInfoById(txid, blockingStubFull); + Assert.assertEquals(1, info.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.REVERT, + info.get().getReceipt().getResult()); + } + + @Test(enabled = true, description = "can not deploy contract by create with bytecode ef0000") + public void test23forbiddenBytecodeStartWithEf() { + String methedStr = "createDeployEf(bytes)"; + String argsStr = "\"0x60ef60005360036000f3\""; + String txid = PublicMethed.triggerContract(contractD, methedStr, argsStr, + false, 0, maxFeeLimit, contractExcAddress, + contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + Optional info = + PublicMethed.getTransactionInfoById(txid, blockingStubFull); + Assert.assertEquals(1, info.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.REVERT, + info.get().getReceipt().getResult()); + } + + @Test(enabled = true, description = "can not deploy contract by create with bytecode " + + "ef00000000000000000000000000000000000000000000000000000000000000") + public void test24forbiddenBytecodeStartWithEf() { + String methedStr = "createDeployEf(bytes)"; + String argsStr = "\"0x60ef60005360206000f3\""; + String txid = PublicMethed.triggerContract(contractD, methedStr, argsStr, + false, 0, maxFeeLimit, contractExcAddress, + contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + Optional info = + PublicMethed.getTransactionInfoById(txid, blockingStubFull); + Assert.assertEquals(1, info.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.REVERT, + info.get().getReceipt().getResult()); + } + + @Test(enabled = true, description = "can deploy contract by create with bytecode fe") + public void test25forbiddenBytecodeStartWithEf() { + String methedStr = "createDeployEf(bytes)"; + String argsStr = "\"0x60fe60005360016000f3\""; + String txid = PublicMethed.triggerContract(contractD, methedStr, argsStr, + false, 0, maxFeeLimit, contractExcAddress, + contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + Optional info = + PublicMethed.getTransactionInfoById(txid, blockingStubFull); + Assert.assertEquals(0, info.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.SUCCESS, + info.get().getReceipt().getResult()); + } + + @Test(enabled = true, description = "can not deploy contract by create2 with bytecode ef") + public void test26forbiddenBytecodeStartWithEf() { + String methedStr = "create2DeployEf(bytes,uint256)"; + String argsStr = "\"0x60ef60005360016000f3\"," + salt; + String txid = PublicMethed.triggerContract(contractD, methedStr, argsStr, + false, 0, maxFeeLimit, contractExcAddress, + contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + Optional info = + PublicMethed.getTransactionInfoById(txid, blockingStubFull); + Assert.assertEquals(1, info.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.REVERT, + info.get().getReceipt().getResult()); + } + + @Test(enabled = true, description = "can not deploy contract by create2 with bytecode ef00") + public void test27forbiddenBytecodeStartWithEf() { + salt++; + String methedStr = "create2DeployEf(bytes,uint256)"; + String argsStr = "\"0x60ef60005360026000f3\"," + salt; + String txid = PublicMethed.triggerContract(contractD, methedStr, argsStr, + false, 0, maxFeeLimit, contractExcAddress, + contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + Optional info = + PublicMethed.getTransactionInfoById(txid, blockingStubFull); + Assert.assertEquals(1, info.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.REVERT, + info.get().getReceipt().getResult()); + } + + @Test(enabled = true, description = "can not deploy contract by create2 with bytecode ef0000") + public void test28forbiddenBytecodeStartWithEf() { + salt++; + String methedStr = "create2DeployEf(bytes,uint256)"; + String argsStr = "\"0x60ef60005360036000f3\"," + salt; + String txid = PublicMethed.triggerContract(contractD, methedStr, argsStr, + false, 0, maxFeeLimit, contractExcAddress, + contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + Optional info = + PublicMethed.getTransactionInfoById(txid, blockingStubFull); + Assert.assertEquals(1, info.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.REVERT, + info.get().getReceipt().getResult()); + } + + @Test(enabled = true, description = "can not deploy contract by create2 with bytecode " + + "ef00000000000000000000000000000000000000000000000000000000000000") + public void test29forbiddenBytecodeStartWithEf() { + salt++; + String methedStr = "create2DeployEf(bytes,uint256)"; + String argsStr = "\"0x60ef60005360206000f3\"," + salt; + String txid = PublicMethed.triggerContract(contractD, methedStr, argsStr, + false, 0, maxFeeLimit, contractExcAddress, + contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + Optional info = + PublicMethed.getTransactionInfoById(txid, blockingStubFull); + Assert.assertEquals(1, info.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.REVERT, + info.get().getReceipt().getResult()); + } + + @Test(enabled = true, description = "can deploy contract by create2 with bytecode fe") + public void test30forbiddenBytecodeStartWithEf() { + salt++; + String methedStr = "create2DeployEf(bytes,uint256)"; + String argsStr = "\"0x60fe60005360016000f3\"," + salt; + String txid = PublicMethed.triggerContract(contractD, methedStr, argsStr, + false, 0, maxFeeLimit, contractExcAddress, + contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + Optional info = + PublicMethed.getTransactionInfoById(txid, blockingStubFull); + Assert.assertEquals(0, info.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.SUCCESS, + info.get().getReceipt().getResult()); + } + + @Test(enabled = true, description = "can not sendcoin to contract") + public void test31forbiddenSendTrxToContract() { + Assert.assertFalse(PublicMethed + .sendcoin(contractD, 100_000_000L, + testNetAccountAddress, testNetAccountKey, blockingStubFull)); + } + + @Test(enabled = true, description = "db key can use high 16 bytes," + + "0x6162630000000000000000000000000000000000000000000000000000000000") + public void test32DbKeyUseHigh16Bytes() { + String slot = "0x6162630000000000000000000000000000000000000000000000000000000000"; + long value = 121; + String methedStr = "setSlot(bytes,uint256)"; + String argsStr = "\"" + slot + "\"," + value; + String txid = PublicMethed.triggerContract(contractD, methedStr, argsStr, + false, 0, maxFeeLimit, contractExcAddress, + contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + Optional info = + PublicMethed.getTransactionInfoById(txid, blockingStubFull); + Assert.assertEquals(0, info.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.SUCCESS, + info.get().getReceipt().getResult()); + + methedStr = "getSlot(bytes)"; + argsStr = "\"" + slot + "\""; + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(contractD, + methedStr, argsStr, false, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + Assert.assertEquals(true, transactionExtention.getResult().getResult()); + Assert.assertEquals("SUCESS", + transactionExtention.getTransaction().getRet(0).getRet().toString()); + long result = ByteArray.toLong(transactionExtention.getConstantResult(0).toByteArray()); + logger.info("result: " + result); + Assert.assertEquals(value, result); + } + + @Test(enabled = true, description = "slot high 16bytes all f," + + "0xffffffffffffffffffffffffffffffff00000000000000000000000000000000") + public void test33DbKeyUseHigh16Bytes() { + String slot = "0xffffffffffffffffffffffffffffffff00000000000000000000000000000000"; + long value = 122; + String methedStr = "setSlot(bytes,uint256)"; + String argsStr = "\"" + slot + "\"," + value; + String txid = PublicMethed.triggerContract(contractD, methedStr, argsStr, + false, 0, maxFeeLimit, contractExcAddress, + contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + Optional info = + PublicMethed.getTransactionInfoById(txid, blockingStubFull); + Assert.assertEquals(0, info.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.SUCCESS, + info.get().getReceipt().getResult()); + + methedStr = "getSlot(bytes)"; + argsStr = "\"" + slot + "\""; + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(contractD, + methedStr, argsStr, false, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + Assert.assertEquals(true, transactionExtention.getResult().getResult()); + Assert.assertEquals("SUCESS", + transactionExtention.getTransaction().getRet(0).getRet().toString()); + long result = ByteArray.toLong(transactionExtention.getConstantResult(0).toByteArray()); + logger.info("result: " + result); + Assert.assertEquals(value, result); + } + + @Test(enabled = true, description = "slot high 16bytes 1," + + " 0x0000000000000000000000000000000100000000000000000000000000000000") + public void test34DbKeyUseHigh16Bytes() { + String slot = "0x0000000000000000000000000000000100000000000000000000000000000000"; + long value = 123; + String methedStr = "setSlot(bytes,uint256)"; + String argsStr = "\"" + slot + "\"," + value; + String txid = PublicMethed.triggerContract(contractD, methedStr, argsStr, + false, 0, maxFeeLimit, contractExcAddress, + contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + Optional info = + PublicMethed.getTransactionInfoById(txid, blockingStubFull); + Assert.assertEquals(0, info.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.SUCCESS, + info.get().getReceipt().getResult()); + + methedStr = "getSlot(bytes)"; + argsStr = "\"" + slot + "\""; + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(contractD, + methedStr, argsStr, false, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + Assert.assertEquals(true, transactionExtention.getResult().getResult()); + Assert.assertEquals("SUCESS", + transactionExtention.getTransaction().getRet(0).getRet().toString()); + long result = ByteArray.toLong(transactionExtention.getConstantResult(0).toByteArray()); + logger.info("result: " + result); + Assert.assertEquals(value, result); + } + + @Test(enabled = true, description = "slot high 16bytes all 0,low 16bytes 1." + + " 0x0000000000000000000000000000000000000000000000000000000000000001") + public void test35DbKeyUseHigh16Bytes() { + String slot = "0x0000000000000000000000000000000000000000000000000000000000000001"; + long value = 124; + String methedStr = "setSlot(bytes,uint256)"; + String argsStr = "\"" + slot + "\"," + value; + String txid = PublicMethed.triggerContract(contractD, methedStr, argsStr, + false, 0, maxFeeLimit, contractExcAddress, + contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + Optional info = + PublicMethed.getTransactionInfoById(txid, blockingStubFull); + Assert.assertEquals(0, info.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.SUCCESS, + info.get().getReceipt().getResult()); + + methedStr = "getSlot(bytes)"; + argsStr = "\"" + slot + "\""; + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(contractD, + methedStr, argsStr, false, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + Assert.assertEquals(true, transactionExtention.getResult().getResult()); + Assert.assertEquals("SUCESS", + transactionExtention.getTransaction().getRet(0).getRet().toString()); + long result = ByteArray.toLong(transactionExtention.getConstantResult(0).toByteArray()); + logger.info("result: " + result); + Assert.assertEquals(value, result); + } + + @Test(enabled = true, description = "slot all 0," + + " 0x0000000000000000000000000000000000000000000000000000000000000000") + public void test36DbKeyUseHigh16BytesAllBytes0() { + String slot = "0x0000000000000000000000000000000000000000000000000000000000000000"; + long value = 125; + String methedStr = "setSlot(bytes,uint256)"; + String argsStr = "\"" + slot + "\"," + value; + String txid = PublicMethed.triggerContract(contractD, methedStr, argsStr, + false, 0, maxFeeLimit, contractExcAddress, + contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + Optional info = + PublicMethed.getTransactionInfoById(txid, blockingStubFull); + Assert.assertEquals(0, info.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.SUCCESS, + info.get().getReceipt().getResult()); + + methedStr = "getSlot(bytes)"; + argsStr = "\"" + slot + "\""; + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(contractD, + methedStr, argsStr, false, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + Assert.assertEquals(true, transactionExtention.getResult().getResult()); + Assert.assertEquals("SUCESS", + transactionExtention.getTransaction().getRet(0).getRet().toString()); + long result = ByteArray.toLong(transactionExtention.getConstantResult(0).toByteArray()); + logger.info("result: " + result); + Assert.assertEquals(value, result); + } + + @Test(enabled = true, description = "slot all f," + + " 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff") + public void test37DbKeyUseHigh16BytesAllBytesF() { + String slot = "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + long value = 126; + String methedStr = "setSlot(bytes,uint256)"; + String argsStr = "\"" + slot + "\"," + value; + String txid = PublicMethed.triggerContract(contractD, methedStr, argsStr, + false, 0, maxFeeLimit, contractExcAddress, + contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + Optional info = + PublicMethed.getTransactionInfoById(txid, blockingStubFull); + Assert.assertEquals(0, info.get().getResultValue()); + Assert.assertEquals(Protocol.Transaction.Result.contractResult.SUCCESS, + info.get().getReceipt().getResult()); + + methedStr = "getSlot(bytes)"; + argsStr = "\"" + slot + "\""; + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(contractD, + methedStr, argsStr, false, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + Assert.assertEquals(true, transactionExtention.getResult().getResult()); + Assert.assertEquals("SUCESS", + transactionExtention.getTransaction().getRet(0).getRet().toString()); + long result = ByteArray.toLong(transactionExtention.getConstantResult(0).toByteArray()); + logger.info("result: " + result); + Assert.assertEquals(value, result); + } + + /** + * constructor. + */ + @AfterClass + public void shutdown() throws InterruptedException { + PublicMethed.freedResource(contractExcAddress, contractExcKey, + testNetAccountAddress, blockingStubFull); + if (channelFull != null) { + channelFull.shutdown().awaitTermination(5, TimeUnit.SECONDS); + } + } + + +} + diff --git a/framework/src/test/resources/soliditycode/EthGrammer.sol b/framework/src/test/resources/soliditycode/EthGrammer.sol new file mode 100644 index 00000000000..45c354ae12d --- /dev/null +++ b/framework/src/test/resources/soliditycode/EthGrammer.sol @@ -0,0 +1,191 @@ +contract C { + constructor() public payable{} + + function baseFee() external view returns (uint ret) { + assembly { + ret := basefee() + } + assert(block.basefee == ret); + } + + function baseFeeOnly() external view returns (uint ret) { + assembly { + ret := basefee() + } + } + + function gasPrice() external view returns (uint ret) { + assembly { + ret := basefee() + } + assert(tx.gasprice == ret); + } + + function gasPriceOnly() external view returns (uint) { + return tx.gasprice; + } + + function testCall(address payable caller, address payable transferTo) public { + (bool success, bytes memory data) = caller.call(abi.encodeWithSignature("transfer(address)",transferTo)); + require(success); + } + + function testDelegateCall(address payable caller, address payable transferTo) public { + (bool success, bytes memory data) = caller.delegatecall(abi.encodeWithSignature("transfer(address)",transferTo)); + require(success); + } + + uint sum = 0; + function transfer(address payable transerTo) public { + for (uint i = 0; i < type(uint256).max; i++) + sum = 0; + for (uint j = 0; j < type(uint8).max; j++) + sum += j; + transerTo.transfer(1); + } + + function testCallFunctionInContract(address payable transferTo) public { + this.transfer(transferTo); + } + + + function getRipemd160(string memory input) public returns(bytes32 output) { + bytes memory tem = bytes(input); + assembly { + if iszero(staticcall(not(0), 0x020003, add(tem, 0x20), mload(tem), output, 0x20)) { + revert(0, 0) + } + output := mload(add(output,0x0c)) + } + } + + function getRipemd160Str(string memory input) public view returns(bytes32 output) { + assembly { + if iszero(staticcall(not(0), 0x020003, add(input, 0x20), mload(input), output, 0x20)) { + revert(0, 0) + } + output := mload(add(output,0x0c)) + } + + } + + function F(uint32 rounds, bytes32[2] memory h, bytes32[4] memory m, bytes8[2] memory t, bool f) public view returns (bytes32[2] memory) { + bytes32[2] memory output; + + bytes memory args = abi.encodePacked(rounds, h[0], h[1], m[0], m[1], m[2], m[3], t[0], t[1], f); + + assembly { + if iszero(staticcall(not(0), 0x020009, add(args, 32), 0xd5, output, 0x40)) { + revert(0, 0) + } + } + + return output; + } + + function callF() public view returns (bytes32[2] memory) { + uint32 rounds = 12; + + bytes32[2] memory h; + h[0] = hex"48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5"; + h[1] = hex"d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b"; + + bytes32[4] memory m; + m[0] = hex"6162630000000000000000000000000000000000000000000000000000000000"; + m[1] = hex"0000000000000000000000000000000000000000000000000000000000000000"; + m[2] = hex"0000000000000000000000000000000000000000000000000000000000000000"; + m[3] = hex"0000000000000000000000000000000000000000000000000000000000000000"; + + bytes8[2] memory t; + t[0] = hex"03000000"; + t[1] = hex"00000000"; + + bool f = true; + + // Expected output: + // ba80a53f981c4d0d6a2797b69f12f6e94c212f14685ac4b74b12bb6fdbffa2d1 + // 7d87c5392aab792dc252d5de4533cc9518d38aa8dbf1925ab92386edd4009923 + return F(rounds, h, m, t, f); + } + + +} + +contract D { + constructor() public payable{} + + function deploy(uint256 salt) public returns(address){ + address addr; + bytes memory code = type(C).creationCode; + assembly { + addr := create2(0, add(code, 0x20), mload(code), salt) + } + return addr; + } + + uint sum = 0; + function transfer(address payable transerTo) public { + for (uint i = 0; i < type(uint256).max; i++) + sum = 0; + for (uint j = 0; j < type(uint8).max; j++) + sum += j; + transerTo.transfer(1); + } + + function callCreate2(uint256 salt) public returns(address){ + address addr; + bytes memory code = type(C).creationCode; + assembly { + addr := create2(0, add(code, 0x20), mload(code), salt) + } + return addr; + } + + function fixCreate2StackDepth(uint salt) public { + if (isEmptyAddress(callCreate2(salt + 1))) { + revert(); + } + this.fixCreate2StackDepth(salt + 1); + } + + function callCreate() public returns(address){ + address addr; + bytes memory code = type(C).creationCode; + assembly { + addr := create(0, add(code, 0x20), mload(code)) + } + return addr; + } + + function fixCreateStackDepth() public { + if (isEmptyAddress(callCreate())) { + revert(); + } + this.fixCreateStackDepth(); + } + + bool constant bool1 = true; + function isEmptyAddress(address add2) public returns(bool result){ + + assembly { + if iszero(extcodesize(add2)) { + result := bool1 + } + } + } + + function deployef(bytes memory code) public{ + address addr; + assembly { + addr := create(0, add(code, 0x20), mload(code)) + if iszero(extcodesize(addr)) { + revert(0, 0) + } + } + } +} + + + + + diff --git a/framework/src/test/resources/soliditycode/EthGrammer02.sol b/framework/src/test/resources/soliditycode/EthGrammer02.sol new file mode 100644 index 00000000000..8caa08d2d2d --- /dev/null +++ b/framework/src/test/resources/soliditycode/EthGrammer02.sol @@ -0,0 +1,43 @@ +contract D { + constructor() public payable{} + + function createDeployEf(bytes memory code) public returns(address addr){ + address addr; + assembly { + addr := create(0, add(code, 0x20), mload(code)) + if iszero(extcodesize(addr)) { + revert(0, 0) + } + } + return addr; + } + + function create2DeployEf(bytes memory code,uint256 salt) public returns(address addr){ + address addr; + assembly { + addr := create2(0, add(code, 0x20), mload(code), salt) + if iszero(extcodesize(addr)) { + revert(0, 0) + } + } + return addr; + } + + function setSlot(bytes memory slot,uint256 value) external { +// uint256 value = 123; + assembly { + sstore(slot, value) + } + } + + function getSlot(bytes memory slot) view external returns(uint res) { + assembly { + res := sload(slot) + } + } +} + + + + + diff --git a/framework/src/test/resources/soliditycode/NewFeatureJavatron440.sol b/framework/src/test/resources/soliditycode/NewFeatureJavatron440.sol deleted file mode 100644 index ff81e49726c..00000000000 --- a/framework/src/test/resources/soliditycode/NewFeatureJavatron440.sol +++ /dev/null @@ -1,87 +0,0 @@ -contract C { - constructor() public payable{} - - function baseFee() external view returns (uint ret) { - assembly { - ret := basefee() - } - assert(block.basefee == ret); - } - - function baseFeeOnly() external view returns (uint ret) { - assembly { - ret := basefee() - } - } - - function gasPrice() external view returns (uint ret) { - assembly { - ret := basefee() - } - assert(tx.gasprice == ret); - } - - function gasPriceOnly() external view returns (uint) { - return tx.gasprice; - } - - function testCall(address payable caller, address payable transferTo) public { - (bool success, bytes memory data) = caller.call(abi.encodeWithSignature("transfer(address)",transferTo)); - require(success); - } - - function testDelegateCall(address payable caller, address payable transferTo) public { - (bool success, bytes memory data) = caller.delegatecall(abi.encodeWithSignature("transfer(address)",transferTo)); - require(success); - } - - uint sum = 0; - function transfer(address payable transerTo) public { - for (uint i = 0; i < type(uint256).max; i++) - sum = 0; - for (uint j = 0; j < type(uint8).max; j++) - sum += j; - transerTo.transfer(1); - } - - function testCallFunctionInContract(address payable transferTo) public { - this.transfer(transferTo); - } - - function getRipemd160(bytes memory input) public view returns(bytes32 output) { - assembly { - if iszero(staticcall(not(0), 0x20003, add(input, 0x20), 0x2, output, 0x20)) { - revert(0, 0) - } - output := mload(add(output,0x0c)) - } - - } - -} - -contract D { - constructor() public payable{} - - function deploy(uint256 salt) public returns(address){ - address addr; - bytes memory code = type(C).creationCode; - assembly { - addr := create2(0, add(code, 0x20), mload(code), salt) - } - return addr; - } - uint sum = 0; - function transfer(address payable transerTo) public { - for (uint i = 0; i < type(uint256).max; i++) - sum = 0; - for (uint j = 0; j < type(uint8).max; j++) - sum += j; - transerTo.transfer(1); - } -} - - - - - From 907ea0fdb75f99c58470257085dae9926e537400 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 15 Sep 2021 17:22:51 +0800 Subject: [PATCH 263/341] execute solidityTrigger after solidityEventTrigger and solidityLogTrigger --- .../main/java/org/tron/core/db/Manager.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index eb48aa594ae..a94694ff352 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -1707,15 +1707,6 @@ private void startEventSubscribing() { } private void postSolidityTrigger(final long latestSolidifiedBlockNumber) { - if (eventPluginLoaded && EventPluginLoader.getInstance().isSolidityTriggerEnable()) { - SolidityTriggerCapsule solidityTriggerCapsule - = new SolidityTriggerCapsule(latestSolidifiedBlockNumber); - boolean result = triggerCapsuleQueue.offer(solidityTriggerCapsule); - if (!result) { - logger.info("too many trigger, lost solidified trigger, " - + "block number: {}", latestSolidifiedBlockNumber); - } - } if (eventPluginLoaded && EventPluginLoader.getInstance().isSolidityLogTriggerEnable()) { for (Long i : Args.getSolidityContractLogTriggerMap().keySet()) { postSolidityLogContractTrigger(i, latestSolidifiedBlockNumber); @@ -1726,6 +1717,15 @@ private void postSolidityTrigger(final long latestSolidifiedBlockNumber) { postSolidityEventContractTrigger(i, latestSolidifiedBlockNumber); } } + if (eventPluginLoaded && EventPluginLoader.getInstance().isSolidityTriggerEnable()) { + SolidityTriggerCapsule solidityTriggerCapsule + = new SolidityTriggerCapsule(latestSolidifiedBlockNumber); + boolean result = triggerCapsuleQueue.offer(solidityTriggerCapsule); + if (!result) { + logger.info("too many trigger, lost solidified trigger, " + + "block number: {}", latestSolidifiedBlockNumber); + } + } } private void postBlockTrigger(final BlockCapsule newBlock) { From 8c1af46206838fe405df586bde5300769f36aa05 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 15 Sep 2021 18:12:42 +0800 Subject: [PATCH 264/341] feat: add ethCompitable for transaction trigger --- .../tron/common/logsfilter/TriggerConfig.java | 5 ++ .../common/logsfilter/trigger/LogPojo.java | 39 +++++++++++ .../trigger/TransactionLogTrigger.java | 6 ++ .../common/logsfilter/EventPluginLoader.java | 10 +++ .../capsule/TransactionLogTriggerCapsule.java | 54 +++++++++++++-- .../java/org/tron/core/config/args/Args.java | 5 ++ .../main/java/org/tron/core/db/Manager.java | 68 +++++++++++++++++-- 7 files changed, 175 insertions(+), 12 deletions(-) create mode 100644 common/src/main/java/org/tron/common/logsfilter/trigger/LogPojo.java diff --git a/common/src/main/java/org/tron/common/logsfilter/TriggerConfig.java b/common/src/main/java/org/tron/common/logsfilter/TriggerConfig.java index c09b2657731..98cd72e5e9d 100644 --- a/common/src/main/java/org/tron/common/logsfilter/TriggerConfig.java +++ b/common/src/main/java/org/tron/common/logsfilter/TriggerConfig.java @@ -21,10 +21,15 @@ public class TriggerConfig { @Setter private boolean redundancy; + @Getter + @Setter + private boolean ethCompatible; + public TriggerConfig() { triggerName = ""; enabled = false; topic = ""; redundancy = false; + ethCompatible = false; } } \ No newline at end of file diff --git a/common/src/main/java/org/tron/common/logsfilter/trigger/LogPojo.java b/common/src/main/java/org/tron/common/logsfilter/trigger/LogPojo.java new file mode 100644 index 00000000000..661c26f0774 --- /dev/null +++ b/common/src/main/java/org/tron/common/logsfilter/trigger/LogPojo.java @@ -0,0 +1,39 @@ +package org.tron.common.logsfilter.trigger; + +import java.util.List; +import lombok.Getter; +import lombok.Setter; + +public class LogPojo { + @Getter + @Setter + private String address; + + @Getter + @Setter + private String blockHash; + + @Getter + @Setter + private long blockNumber; + + @Getter + @Setter + private String data; + + @Getter + @Setter + private long logIndex; + + @Getter + @Setter + private List topicList; + + @Getter + @Setter + private String transactionHash; + + @Getter + @Setter + private long transactionIndex; +} diff --git a/common/src/main/java/org/tron/common/logsfilter/trigger/TransactionLogTrigger.java b/common/src/main/java/org/tron/common/logsfilter/trigger/TransactionLogTrigger.java index 7f701b42ab7..c7f74fc6694 100644 --- a/common/src/main/java/org/tron/common/logsfilter/trigger/TransactionLogTrigger.java +++ b/common/src/main/java/org/tron/common/logsfilter/trigger/TransactionLogTrigger.java @@ -81,6 +81,12 @@ public class TransactionLogTrigger extends Trigger { @Getter @Setter private String data; + @Getter + @Setter + private long preCumulativeLogCount; + @Getter + @Setter + private List logList; public TransactionLogTrigger() { setTriggerName(Trigger.TRANSACTION_TRIGGER_NAME); diff --git a/framework/src/main/java/org/tron/common/logsfilter/EventPluginLoader.java b/framework/src/main/java/org/tron/common/logsfilter/EventPluginLoader.java index 8a8abd13fd0..e3f37b81c3f 100644 --- a/framework/src/main/java/org/tron/common/logsfilter/EventPluginLoader.java +++ b/framework/src/main/java/org/tron/common/logsfilter/EventPluginLoader.java @@ -46,6 +46,8 @@ public class EventPluginLoader { private boolean transactionLogTriggerEnable = false; + private boolean transactionLogTriggerEthCompatible = false; + private boolean contractEventTriggerEnable = false; private boolean contractLogTriggerEnable = false; @@ -257,8 +259,12 @@ private void setSingleTriggerConfig(TriggerConfig triggerConfig) { .equalsIgnoreCase(triggerConfig.getTriggerName())) { if (triggerConfig.isEnabled()) { transactionLogTriggerEnable = true; + if (triggerConfig.isEthCompatible()) { + transactionLogTriggerEthCompatible = true; + } } else { transactionLogTriggerEnable = false; + transactionLogTriggerEthCompatible = false; } if (!useNativeQueue) { @@ -364,6 +370,10 @@ public synchronized boolean isTransactionLogTriggerEnable() { return transactionLogTriggerEnable; } + public synchronized boolean isTransactionLogTriggerEthCompatible() { + return transactionLogTriggerEthCompatible; + } + public synchronized boolean isContractEventTriggerEnable() { return contractEventTriggerEnable; } diff --git a/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java b/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java index 83a920640b6..5a1c3833628 100644 --- a/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java +++ b/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java @@ -16,6 +16,7 @@ import org.bouncycastle.util.encoders.Hex; import org.tron.common.logsfilter.EventPluginLoader; import org.tron.common.logsfilter.trigger.InternalTransactionPojo; +import org.tron.common.logsfilter.trigger.LogPojo; import org.tron.common.logsfilter.trigger.TransactionLogTrigger; import org.tron.common.runtime.InternalTransaction; import org.tron.common.runtime.ProgramResult; @@ -24,6 +25,7 @@ import org.tron.core.capsule.TransactionCapsule; import org.tron.core.db.TransactionTrace; import org.tron.protos.Protocol; +import org.tron.protos.Protocol.TransactionInfo; import org.tron.protos.contract.AssetIssueContractOuterClass.TransferAssetContract; import org.tron.protos.contract.BalanceContract.TransferContract; import org.tron.protos.contract.SmartContractOuterClass.CreateSmartContract; @@ -36,19 +38,28 @@ public class TransactionLogTriggerCapsule extends TriggerCapsule { @Setter private TransactionLogTrigger transactionLogTrigger; + public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule blockCapsule) { + this(trxCapsule, blockCapsule, 0, 0, 0, null); + } + public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule blockCapsule, - int index, long cumulativeEnergyUsed) { + int txIndex, long preCumulativeEnergyUsed, long preCumulativeLogCount, + TransactionInfo transactionInfo) { transactionLogTrigger = new TransactionLogTrigger(); + + String blockHash = ""; if (Objects.nonNull(blockCapsule)) { - transactionLogTrigger.setBlockHash(blockCapsule.getBlockId().toString()); + blockHash = blockCapsule.getBlockId().toString(); + transactionLogTrigger.setBlockHash(blockHash); } - transactionLogTrigger.setTransactionId(trxCapsule.getTransactionId().toString()); + + String transactionHash = trxCapsule.getTransactionId().toString(); + transactionLogTrigger.setTransactionId(transactionHash); transactionLogTrigger.setTimeStamp(blockCapsule.getTimeStamp()); transactionLogTrigger.setBlockNumber(trxCapsule.getBlockNum()); transactionLogTrigger.setData(Hex.toHexString(trxCapsule .getInstance().getRawData().getData().toByteArray())); - transactionLogTrigger.setTransactionIndex(index); TransactionTrace trxTrace = trxCapsule.getTrxTrace(); @@ -139,7 +150,7 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule } } } catch (Exception e) { - logger.error("failed to load transferAssetContract, error'{}'", e); + logger.error("failed to load transferAssetContract, error '{}'", e.getMessage()); } } } @@ -156,7 +167,6 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule transactionLogTrigger.setNetFee(trxTrace.getReceipt().getNetFee()); transactionLogTrigger.setEnergyUsage(trxTrace.getReceipt().getEnergyUsage()); } - transactionLogTrigger.setCumulativeEnergyUsed(cumulativeEnergyUsed + energyUsageTotal); // program result if (Objects.nonNull(trxTrace) && Objects.nonNull(trxTrace.getRuntime()) && Objects @@ -178,6 +188,38 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule transactionLogTrigger.setInternalTransactionList( getInternalTransactionList(programResult.getInternalTransactions())); } + + // process transactionInfo list, only enabled when ethCompatible is true + if (Objects.nonNull(transactionInfo)) { + transactionLogTrigger.setTransactionIndex(txIndex); + transactionLogTrigger.setCumulativeEnergyUsed(preCumulativeEnergyUsed + energyUsageTotal); + transactionLogTrigger.setPreCumulativeLogCount(preCumulativeLogCount); + + List logPojoList = new ArrayList<>(); + for (int index = 0; index < transactionInfo.getLogCount(); index++) { + TransactionInfo.Log log = transactionInfo.getLogList().get(index); + LogPojo logPojo = new LogPojo(); + + logPojo.setAddress(StringUtil.encode58Check((log.getAddress().toByteArray()))); + logPojo.setBlockHash(blockHash); + logPojo.setBlockNumber(trxCapsule.getBlockNum()); + logPojo.setData(Hex.toHexString(log.getData().toByteArray())); + logPojo.setLogIndex(preCumulativeLogCount + index); + + List topics = new ArrayList<>(); + for (int i = 0; i < log.getTopicsCount(); i++) { + topics.add(Hex.toHexString(log.getTopics(i).toByteArray())); + } + logPojo.setTopicList(topics); + + logPojo.setTransactionHash(transactionHash); + logPojo.setTransactionIndex(txIndex); + + logPojoList.add(logPojo); + } + + transactionLogTrigger.setLogList(logPojoList); + } } public void setLatestSolidifiedBlockNumber(long latestSolidifiedBlockNumber) { diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index 750546c41d3..2c766381b26 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -969,6 +969,11 @@ private static TriggerConfig createTriggerConfig(ConfigObject triggerObject) { triggerConfig.setRedundancy("true".equalsIgnoreCase(redundancy)); } + if (triggerObject.containsKey("ethCompatible")) { + String ethCompatible = triggerObject.get("ethCompatible").unwrapped().toString(); + triggerConfig.setEthCompatible("true".equalsIgnoreCase(ethCompatible)); + } + return triggerConfig; } diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index eb48aa594ae..d7ce6707cc1 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -48,6 +48,7 @@ import org.bouncycastle.util.encoders.Hex; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.tron.api.GrpcAPI.TransactionInfoList; import org.tron.common.args.GenesisBlock; import org.tron.common.logsfilter.EventPluginLoader; import org.tron.common.logsfilter.FilterQuery; @@ -1739,20 +1740,64 @@ private void postBlockTrigger(final BlockCapsule newBlock) { } if (eventPluginLoaded && EventPluginLoader.getInstance().isTransactionLogTriggerEnable()) { - long cumulativeEnergyUsed = 0; List transactionCapsuleList = newBlock.getTransactions(); - for (int i = 0; i < transactionCapsuleList.size(); i++) { - cumulativeEnergyUsed += postTransactionTrigger(transactionCapsuleList.get(i), newBlock, i, - cumulativeEnergyUsed); + + // get transactionInfoList + if (EventPluginLoader.getInstance().isTransactionLogTriggerEthCompatible()) { + TransactionInfoList transactionInfoList = null; + TransactionInfoList.Builder transactionInfoListBuilder = TransactionInfoList.newBuilder(); + + try { + TransactionRetCapsule result = chainBaseManager.getTransactionRetStore() + .getTransactionInfoByBlockNum(ByteArray.fromLong(newBlock.getNum())); + + if (!Objects.isNull(result) && !Objects.isNull(result.getInstance())) { + result.getInstance().getTransactioninfoList().forEach( + transactionInfoListBuilder::addTransactionInfo + ); + + transactionInfoList = transactionInfoListBuilder.build(); + } + } catch (BadItemException e) { + logger.error("postBlockTrigger getTransactionInfoList blockNum={}, error is {}", + newBlock.getNum(), e.getMessage()); + } + + if (transactionInfoList != null + && transactionCapsuleList.size() == transactionInfoList.getTransactionInfoCount()) { + long cumulativeEnergyUsed = 0; + long cumulativeLogCount = 0; + for (int i = 0; i < transactionCapsuleList.size(); i++) { + TransactionInfo transactionInfo = transactionInfoList.getTransactionInfo(i); + TransactionCapsule transactionCapsule = transactionCapsuleList.get(i); + + cumulativeEnergyUsed += postTransactionTrigger(transactionCapsule, newBlock, i, + cumulativeEnergyUsed, cumulativeLogCount, transactionInfo); + + cumulativeLogCount += transactionInfo.getLogCount(); + } + } else { + logger.error("postBlockTrigger blockNum={} the sizes of transactionInfoList " + + "and transactionCapsuleList are not equal", newBlock.getNum()); + for (TransactionCapsule e : newBlock.getTransactions()) { + postTransactionTrigger(e, newBlock); + } + } + } else { + for (TransactionCapsule e : newBlock.getTransactions()) { + postTransactionTrigger(e, newBlock); + } } } } // return energyUsageTotal of the current transaction + // cumulativeEnergyUsed is the total of energy used before the current transaction private long postTransactionTrigger(final TransactionCapsule trxCap, - final BlockCapsule blockCap, int index, long cumulativeEnergyUsed) { + final BlockCapsule blockCap, int index, long preCumulativeEnergyUsed, + long cumulativeLogCount, final TransactionInfo transactionInfo) { TransactionLogTriggerCapsule trx = new TransactionLogTriggerCapsule(trxCap, blockCap, - index, cumulativeEnergyUsed); + index, preCumulativeEnergyUsed, cumulativeLogCount, transactionInfo); trx.setLatestSolidifiedBlockNumber(getDynamicPropertiesStore() .getLatestSolidifiedBlockNum()); if (!triggerCapsuleQueue.offer(trx)) { @@ -1762,6 +1807,17 @@ private long postTransactionTrigger(final TransactionCapsule trxCap, return trx.getTransactionLogTrigger().getEnergyUsageTotal(); } + + private void postTransactionTrigger(final TransactionCapsule trxCap, + final BlockCapsule blockCap) { + TransactionLogTriggerCapsule trx = new TransactionLogTriggerCapsule(trxCap, blockCap); + trx.setLatestSolidifiedBlockNumber(getDynamicPropertiesStore() + .getLatestSolidifiedBlockNum()); + if (!triggerCapsuleQueue.offer(trx)) { + logger.info("too many triggers, transaction trigger lost: {}", trxCap.getTransactionId()); + } + } + private void reOrgContractTrigger() { if (eventPluginLoaded && (EventPluginLoader.getInstance().isContractEventTriggerEnable() From 21e004d9b800fd0a6371c4c2afe8dbb4d1250db6 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 15 Sep 2021 21:34:15 +0800 Subject: [PATCH 265/341] typo --- .../common/logsfilter/capsule/TransactionLogTriggerCapsule.java | 1 - 1 file changed, 1 deletion(-) diff --git a/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java b/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java index 5a1c3833628..fc67cace8a6 100644 --- a/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java +++ b/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java @@ -60,7 +60,6 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule transactionLogTrigger.setData(Hex.toHexString(trxCapsule .getInstance().getRawData().getData().toByteArray())); - TransactionTrace trxTrace = trxCapsule.getTrxTrace(); //result From bd2586cedd3b56d053b0152c40bd3324b8941006 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 16 Sep 2021 01:32:30 +0800 Subject: [PATCH 266/341] feat: save hexstring of address to logPojo --- .../logsfilter/capsule/TransactionLogTriggerCapsule.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java b/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java index fc67cace8a6..5518d40807e 100644 --- a/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java +++ b/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java @@ -199,7 +199,8 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule TransactionInfo.Log log = transactionInfo.getLogList().get(index); LogPojo logPojo = new LogPojo(); - logPojo.setAddress(StringUtil.encode58Check((log.getAddress().toByteArray()))); + logPojo.setAddress((log.getAddress() != null) ? + Hex.toHexString(log.getAddress().toByteArray()) : ""); logPojo.setBlockHash(blockHash); logPojo.setBlockNumber(trxCapsule.getBlockNum()); logPojo.setData(Hex.toHexString(log.getData().toByteArray())); From a1a8b89706595411ea8f35b7ee1cb6a26ab77c12 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 16 Sep 2021 12:28:58 +0800 Subject: [PATCH 267/341] feat: add effectiveGasPrice to transactionLog --- .../common/logsfilter/trigger/TransactionLogTrigger.java | 3 +++ .../logsfilter/capsule/TransactionLogTriggerCapsule.java | 9 +++++---- framework/src/main/java/org/tron/core/db/Manager.java | 7 ++++--- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/common/src/main/java/org/tron/common/logsfilter/trigger/TransactionLogTrigger.java b/common/src/main/java/org/tron/common/logsfilter/trigger/TransactionLogTrigger.java index c7f74fc6694..9fdc37a63de 100644 --- a/common/src/main/java/org/tron/common/logsfilter/trigger/TransactionLogTrigger.java +++ b/common/src/main/java/org/tron/common/logsfilter/trigger/TransactionLogTrigger.java @@ -87,6 +87,9 @@ public class TransactionLogTrigger extends Trigger { @Getter @Setter private List logList; + @Getter + @Setter + private long energyUnitPrice; public TransactionLogTrigger() { setTriggerName(Trigger.TRANSACTION_TRIGGER_NAME); diff --git a/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java b/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java index 5518d40807e..a5aa98e0c8d 100644 --- a/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java +++ b/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java @@ -39,12 +39,12 @@ public class TransactionLogTriggerCapsule extends TriggerCapsule { private TransactionLogTrigger transactionLogTrigger; public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule blockCapsule) { - this(trxCapsule, blockCapsule, 0, 0, 0, null); + this(trxCapsule, blockCapsule, 0, 0, 0, null, 0); } public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule blockCapsule, int txIndex, long preCumulativeEnergyUsed, long preCumulativeLogCount, - TransactionInfo transactionInfo) { + TransactionInfo transactionInfo, long energyUnitPrice) { transactionLogTrigger = new TransactionLogTrigger(); String blockHash = ""; @@ -193,14 +193,15 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule transactionLogTrigger.setTransactionIndex(txIndex); transactionLogTrigger.setCumulativeEnergyUsed(preCumulativeEnergyUsed + energyUsageTotal); transactionLogTrigger.setPreCumulativeLogCount(preCumulativeLogCount); + transactionLogTrigger.setEnergyUnitPrice(energyUnitPrice); List logPojoList = new ArrayList<>(); for (int index = 0; index < transactionInfo.getLogCount(); index++) { TransactionInfo.Log log = transactionInfo.getLogList().get(index); LogPojo logPojo = new LogPojo(); - logPojo.setAddress((log.getAddress() != null) ? - Hex.toHexString(log.getAddress().toByteArray()) : ""); + logPojo.setAddress((log.getAddress() != null) + ? Hex.toHexString(log.getAddress().toByteArray()) : ""); logPojo.setBlockHash(blockHash); logPojo.setBlockNumber(trxCapsule.getBlockNum()); logPojo.setData(Hex.toHexString(log.getData().toByteArray())); diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index c86bd58047b..1d678b01ada 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -1746,6 +1746,7 @@ private void postBlockTrigger(final BlockCapsule newBlock) { if (EventPluginLoader.getInstance().isTransactionLogTriggerEthCompatible()) { TransactionInfoList transactionInfoList = null; TransactionInfoList.Builder transactionInfoListBuilder = TransactionInfoList.newBuilder(); + long energyUnitPrice = chainBaseManager.getDynamicPropertiesStore().getEnergyFee(); try { TransactionRetCapsule result = chainBaseManager.getTransactionRetStore() @@ -1772,7 +1773,7 @@ private void postBlockTrigger(final BlockCapsule newBlock) { TransactionCapsule transactionCapsule = transactionCapsuleList.get(i); cumulativeEnergyUsed += postTransactionTrigger(transactionCapsule, newBlock, i, - cumulativeEnergyUsed, cumulativeLogCount, transactionInfo); + cumulativeEnergyUsed, cumulativeLogCount, transactionInfo, energyUnitPrice); cumulativeLogCount += transactionInfo.getLogCount(); } @@ -1795,9 +1796,9 @@ private void postBlockTrigger(final BlockCapsule newBlock) { // cumulativeEnergyUsed is the total of energy used before the current transaction private long postTransactionTrigger(final TransactionCapsule trxCap, final BlockCapsule blockCap, int index, long preCumulativeEnergyUsed, - long cumulativeLogCount, final TransactionInfo transactionInfo) { + long cumulativeLogCount, final TransactionInfo transactionInfo, long energyUnitPrice) { TransactionLogTriggerCapsule trx = new TransactionLogTriggerCapsule(trxCap, blockCap, - index, preCumulativeEnergyUsed, cumulativeLogCount, transactionInfo); + index, preCumulativeEnergyUsed, cumulativeLogCount, transactionInfo, energyUnitPrice); trx.setLatestSolidifiedBlockNumber(getDynamicPropertiesStore() .getLatestSolidifiedBlockNum()); if (!triggerCapsuleQueue.offer(trx)) { From 0327c9dfb54de8a35ed9c04fd0614fbc8c049f4d Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 16 Sep 2021 13:58:06 +0800 Subject: [PATCH 268/341] fix: to address is null when create smart contract --- .../java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index 3315ba97817..99581005c14 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -154,9 +154,9 @@ public static List getTo(Transaction transaction) { list.add(receiverAddress); } break; - case CreateSmartContract: - list.add(ByteString.copyFrom(generateContractAddress(transaction))); - break; + // case CreateSmartContract: + // list.add(ByteString.copyFrom(generateContractAddress(transaction))); + // break; case TriggerSmartContract: list.add(contractParameter.unpack(TriggerSmartContract.class).getContractAddress()); break; From 6ce8e051a12bec9abbf3b88f1b180b94244befb8 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 16 Sep 2021 14:12:13 +0800 Subject: [PATCH 269/341] feat: add effectiveGasPrice to TransactionReceipt and make result order by alphabetic --- .../org/tron/core/services/jsonrpc/TransactionReceipt.java | 4 ++++ .../org/tron/core/services/jsonrpc/TransactionResult.java | 2 ++ .../main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java | 2 ++ 3 files changed, 8 insertions(+) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java index 66d7819d3f5..93306f8623a 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java @@ -4,6 +4,7 @@ import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getToAddress; import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; import java.util.ArrayList; import java.util.List; import org.tron.api.GrpcAPI.TransactionInfoList; @@ -16,6 +17,7 @@ import org.tron.protos.Protocol.Transaction.Contract; import org.tron.protos.Protocol.TransactionInfo; +@JsonPropertyOrder(alphabetic=true) public class TransactionReceipt { public static class TransactionLog { @@ -43,6 +45,7 @@ public TransactionLog() { public String to; public String cumulativeGasUsed; + public String effectiveGasPrice; public String gasUsed; public String contractAddress; public TransactionLog[] logs; @@ -87,6 +90,7 @@ public TransactionReceipt(Protocol.Block block, TransactionInfo txInfo, Wallet w blockHash = ByteArray.toJsonHex(blockCapsule.getBlockId().getBytes()); blockNumber = ByteArray.toJsonHex(blockCapsule.getNum()); transactionHash = ByteArray.toJsonHex(txInfo.getId().toByteArray()); + effectiveGasPrice = ByteArray.toJsonHex(wallet.getEnergyFee(blockCapsule.getTimeStamp())); if (transaction != null && !transaction.getRawData().getContractList().isEmpty()) { Contract contract = transaction.getRawData().getContract(0); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java index f5b11592a31..d6527e4eeee 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java @@ -3,6 +3,7 @@ import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getToAddress; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTransactionAmount; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.google.protobuf.ByteString; import java.util.Arrays; import lombok.ToString; @@ -14,6 +15,7 @@ import org.tron.protos.Protocol.Transaction; import org.tron.protos.Protocol.Transaction.Contract; +@JsonPropertyOrder(alphabetic=true) @ToString public class TransactionResult { diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index a76122e1638..6bbeff4b5c0 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -1,6 +1,7 @@ package org.tron.core.services.jsonrpc; import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.googlecode.jsonrpc4j.JsonRpcError; import com.googlecode.jsonrpc4j.JsonRpcErrors; import com.googlecode.jsonrpc4j.JsonRpcMethod; @@ -28,6 +29,7 @@ class SyncingResult { private final String highestBlock; } + @JsonPropertyOrder(alphabetic=true) class BlockResult { public String number; From 047d00abd24923c56f170b26884467dd0da4f99b Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 16 Sep 2021 14:17:40 +0800 Subject: [PATCH 270/341] feat: add order for TransactionLog in TransactionReceipt --- .../org/tron/core/services/jsonrpc/TransactionReceipt.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java index 93306f8623a..8de3c11cb83 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java @@ -20,8 +20,8 @@ @JsonPropertyOrder(alphabetic=true) public class TransactionReceipt { + @JsonPropertyOrder(alphabetic=true) public static class TransactionLog { - public String logIndex; public String blockHash; public String blockNumber; @@ -33,7 +33,6 @@ public static class TransactionLog { public boolean removed = false; public TransactionLog() { - } } From d04b16942a664b5f9ee302c6d4660048465b8aa0 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 16 Sep 2021 15:07:45 +0800 Subject: [PATCH 271/341] fix: fix get contract value due to proposal updated --- .../services/http/GetContractInfoServlet.java | 22 ++++++++++++++----- .../services/http/GetContractServlet.java | 22 ++++++++++++++----- .../services/jsonrpc/TransactionReceipt.java | 5 +++-- .../services/jsonrpc/TransactionResult.java | 2 +- .../core/services/jsonrpc/TronJsonRpc.java | 2 +- .../services/jsonrpc/TronJsonRpcImpl.java | 13 +++++++++++ 6 files changed, 50 insertions(+), 16 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/http/GetContractInfoServlet.java b/framework/src/main/java/org/tron/core/services/http/GetContractInfoServlet.java index 32aabca5eb8..86ed7f6d9b6 100644 --- a/framework/src/main/java/org/tron/core/services/http/GetContractInfoServlet.java +++ b/framework/src/main/java/org/tron/core/services/http/GetContractInfoServlet.java @@ -35,9 +35,14 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) { BytesMessage.Builder build = BytesMessage.newBuilder(); JsonFormat.merge(jsonObject.toJSONString(), build, visible); SmartContractDataWrapper smartContract = wallet.getContractInfo(build.build()); - JSONObject jsonSmartContract = JSONObject - .parseObject(JsonFormat.printToString(smartContract, visible)); - response.getWriter().println(jsonSmartContract.toJSONString()); + + if (smartContract == null) { + response.getWriter().println("{}"); + } else { + JSONObject jsonSmartContract = JSONObject + .parseObject(JsonFormat.printToString(smartContract, visible)); + response.getWriter().println(jsonSmartContract.toJSONString()); + } } catch (Exception e) { Util.processError(e, response); } @@ -58,9 +63,14 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) BytesMessage.Builder build = BytesMessage.newBuilder(); JsonFormat.merge(input, build, visible); SmartContractDataWrapper smartContract = wallet.getContractInfo(build.build()); - JSONObject jsonSmartContract = JSONObject - .parseObject(JsonFormat.printToString(smartContract, visible)); - response.getWriter().println(jsonSmartContract.toJSONString()); + + if (smartContract == null) { + response.getWriter().println("{}"); + } else { + JSONObject jsonSmartContract = JSONObject + .parseObject(JsonFormat.printToString(smartContract, visible)); + response.getWriter().println(jsonSmartContract.toJSONString()); + } } catch (Exception e) { Util.processError(e, response); } diff --git a/framework/src/main/java/org/tron/core/services/http/GetContractServlet.java b/framework/src/main/java/org/tron/core/services/http/GetContractServlet.java index d848a762622..b9efd6c1520 100644 --- a/framework/src/main/java/org/tron/core/services/http/GetContractServlet.java +++ b/framework/src/main/java/org/tron/core/services/http/GetContractServlet.java @@ -33,9 +33,14 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) { BytesMessage.Builder build = BytesMessage.newBuilder(); JsonFormat.merge(jsonObject.toJSONString(), build, visible); SmartContract smartContract = wallet.getContract(build.build()); - JSONObject jsonSmartContract = JSONObject - .parseObject(JsonFormat.printToString(smartContract, visible)); - response.getWriter().println(jsonSmartContract.toJSONString()); + + if (smartContract == null) { + response.getWriter().println("{}"); + } else { + JSONObject jsonSmartContract = JSONObject + .parseObject(JsonFormat.printToString(smartContract, visible)); + response.getWriter().println(jsonSmartContract.toJSONString()); + } } catch (Exception e) { Util.processError(e, response); } @@ -56,9 +61,14 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) BytesMessage.Builder build = BytesMessage.newBuilder(); JsonFormat.merge(input, build, visible); SmartContract smartContract = wallet.getContract(build.build()); - JSONObject jsonSmartContract = JSONObject - .parseObject(JsonFormat.printToString(smartContract, visible)); - response.getWriter().println(jsonSmartContract.toJSONString()); + + if (smartContract == null) { + response.getWriter().println("{}"); + } else { + JSONObject jsonSmartContract = JSONObject + .parseObject(JsonFormat.printToString(smartContract, visible)); + response.getWriter().println(jsonSmartContract.toJSONString()); + } } catch (Exception e) { Util.processError(e, response); } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java index 8de3c11cb83..530cbdd9e1c 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java @@ -17,11 +17,12 @@ import org.tron.protos.Protocol.Transaction.Contract; import org.tron.protos.Protocol.TransactionInfo; -@JsonPropertyOrder(alphabetic=true) +@JsonPropertyOrder(alphabetic = true) public class TransactionReceipt { - @JsonPropertyOrder(alphabetic=true) + @JsonPropertyOrder(alphabetic = true) public static class TransactionLog { + public String logIndex; public String blockHash; public String blockNumber; diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java index d6527e4eeee..828fb95426e 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java @@ -15,7 +15,7 @@ import org.tron.protos.Protocol.Transaction; import org.tron.protos.Protocol.Transaction.Contract; -@JsonPropertyOrder(alphabetic=true) +@JsonPropertyOrder(alphabetic = true) @ToString public class TransactionResult { diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 6bbeff4b5c0..cb3a759d683 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -29,7 +29,7 @@ class SyncingResult { private final String highestBlock; } - @JsonPropertyOrder(alphabetic=true) + @JsonPropertyOrder(alphabetic = true) class BlockResult { public String number; diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index a49878f7770..05f6a3ab216 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -47,6 +47,7 @@ import org.tron.core.services.http.JsonFormat; import org.tron.core.services.http.Util; import org.tron.core.store.StorageRowStore; +import org.tron.core.vm.config.VMConfig; import org.tron.core.vm.program.Storage; import org.tron.program.Version; import org.tron.protos.Protocol.Account; @@ -371,9 +372,21 @@ public String getStorageAt(String address, String storageIdx, String blockNumOrT } else if ("latest".equalsIgnoreCase(blockNumOrTag)) { byte[] addressByte = addressHashToByteArray(address); + // get contract from contractStore + BytesMessage.Builder build = BytesMessage.newBuilder(); + BytesMessage bytesMessage = build.setValue(ByteString.copyFrom(addressByte)).build(); + SmartContract smartContract = wallet.getContract(bytesMessage); + if (smartContract == null) { + return ByteArray.toJsonHex(new byte[32]); + } + StorageRowStore store = manager.getStorageRowStore(); Storage storage = new Storage(addressByte, store); + // init Tvm config + storage.setContractVersion(smartContract.getVersion()); + VMConfig.initAllowTvmCompatibleEvm(1); + DataWord value = storage.getValue(new DataWord(ByteArray.fromHexString(storageIdx))); return ByteArray.toJsonHex(value == null ? new byte[32] : value.getData()); } else { From 50dc84264159965278e5aeabe4d481b3c971c82c Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 16 Sep 2021 16:38:52 +0800 Subject: [PATCH 272/341] feat: clear nodeHandlerMap after test for trimTableTest_removeNotConnectibleNodes and trimTableTest_removeByReputation --- .../tron/common/overlay/discover/node/NodeManager.java | 5 +++++ .../common/overlay/discover/node/NodeManagerTest.java | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/framework/src/main/java/org/tron/common/overlay/discover/node/NodeManager.java b/framework/src/main/java/org/tron/common/overlay/discover/node/NodeManager.java index 7e14f84c087..60a15f92e62 100644 --- a/framework/src/main/java/org/tron/common/overlay/discover/node/NodeManager.java +++ b/framework/src/main/java/org/tron/common/overlay/discover/node/NodeManager.java @@ -288,6 +288,11 @@ public Node getPublicHomeNode() { return homeNode; } + // just for test + public void clearNodeHandlerMap() { + nodeHandlerMap.clear(); + } + public void close() { try { nodeManagerTasksTimer.cancel(); diff --git a/framework/src/test/java/org/tron/common/overlay/discover/node/NodeManagerTest.java b/framework/src/test/java/org/tron/common/overlay/discover/node/NodeManagerTest.java index c5f12861b3a..a9f31639061 100644 --- a/framework/src/test/java/org/tron/common/overlay/discover/node/NodeManagerTest.java +++ b/framework/src/test/java/org/tron/common/overlay/discover/node/NodeManagerTest.java @@ -94,6 +94,8 @@ public void trimTableTest_removeByReputation() throws Exception { //insert 3001 nodes(isConnectible = true) with threshold = 3000 final int totalNodes = insertValues(3002); Assert.assertEquals(calculateTrimNodes(totalNodes, 0), getHandlerMapSize()); + + clearNodeManager(); } @Test @@ -104,6 +106,12 @@ public void trimTableTest_removeNotConnectibleNodes() throws Exception { method.setAccessible(true); method.invoke(nodeManager); Assert.assertEquals(calculateTrimNodes(totalNodes, 2), getHandlerMapSize()); + + clearNodeManager(); + } + + private void clearNodeManager() { + nodeManager.clearNodeHandlerMap(); } /** From 350a50ff73fc979280f1a02ef1746a8b27d4ee8a Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 16 Sep 2021 16:48:30 +0800 Subject: [PATCH 273/341] typo --- .../tron/core/services/jsonrpc/JsonRpcApiUtil.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index 99581005c14..7ef8f8ba092 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -154,21 +154,9 @@ public static List getTo(Transaction transaction) { list.add(receiverAddress); } break; - // case CreateSmartContract: - // list.add(ByteString.copyFrom(generateContractAddress(transaction))); - // break; case TriggerSmartContract: list.add(contractParameter.unpack(TriggerSmartContract.class).getContractAddress()); break; - // case BuyStorageContract: - // owner = contractParameter.unpack(BuyStorageContract.class).getOwnerAddress(); - // break; - // case BuyStorageBytesContract: - // owner = contractParameter.unpack(BuyStorageBytesContract.class).getOwnerAddress(); - // break; - // case SellStorageContract: - // owner = contractParameter.unpack(SellStorageContract.class).getOwnerAddress(); - // break; case UpdateSettingContract: list.add(contractParameter.unpack(UpdateSettingContract.class).getContractAddress()); break; From 50fac8842e7b73b46413aa3370b44fadc063b8fe Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 16 Sep 2021 16:56:38 +0800 Subject: [PATCH 274/341] typo --- .../tron/core/services/jsonrpc/JsonRpcApiUtil.java | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index 7ef8f8ba092..681fdc44b2b 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -185,20 +185,6 @@ public static List getTo(Transaction transaction) { return list; } - public static byte[] generateContractAddress(Transaction trx) { - - CreateSmartContract contract = ContractCapsule.getSmartContractFromTransaction(trx); - byte[] ownerAddress = contract.getOwnerAddress().toByteArray(); - - byte[] txRawDataHash = Sha256Hash.hash(true, trx.getRawData().toByteArray()); - - byte[] combined = new byte[txRawDataHash.length + ownerAddress.length]; - System.arraycopy(txRawDataHash, 0, combined, 0, txRawDataHash.length); - System.arraycopy(ownerAddress, 0, combined, txRawDataHash.length, ownerAddress.length); - - return Hash.sha3omit12(combined); - } - public static String getTxID(Transaction transaction) { return ByteArray.toHexString(Sha256Hash.hash(true, transaction.getRawData().toByteArray())); } From d9e41bb28949478027a758115deb2c4f5354f0e0 Mon Sep 17 00:00:00 2001 From: Asuka Date: Thu, 16 Sep 2021 17:31:37 +0800 Subject: [PATCH 275/341] fix(tvm): do not get energy limit from user when creating contract in constant mode. --- .../org/tron/core/actuator/VMActuator.java | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/actuator/VMActuator.java b/actuator/src/main/java/org/tron/core/actuator/VMActuator.java index 1d9b6797cd1..299c9f1dc99 100644 --- a/actuator/src/main/java/org/tron/core/actuator/VMActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/VMActuator.java @@ -350,22 +350,23 @@ private void create() long energyLimit; // according to version - if (StorageUtils.getEnergyLimitHardFork()) { - if (callValue < 0) { - throw new ContractValidateException("callValue must be >= 0"); - } - if (tokenValue < 0) { - throw new ContractValidateException("tokenValue must be >= 0"); - } - if (newSmartContract.getOriginEnergyLimit() <= 0) { - throw new ContractValidateException("The originEnergyLimit must be > 0"); - } - energyLimit = getAccountEnergyLimitWithFixRatio(creator, feeLimit, callValue); - } else { - energyLimit = getAccountEnergyLimitWithFloatRatio(creator, feeLimit, callValue); - } if (isConstantCall) { energyLimit = CommonParameter.getInstance().maxEnergyLimitForConstant; + } else { + if (StorageUtils.getEnergyLimitHardFork()) { + if (callValue < 0) { + throw new ContractValidateException("callValue must be >= 0"); + } + if (tokenValue < 0) { + throw new ContractValidateException("tokenValue must be >= 0"); + } + if (newSmartContract.getOriginEnergyLimit() <= 0) { + throw new ContractValidateException("The originEnergyLimit must be > 0"); + } + energyLimit = getAccountEnergyLimitWithFixRatio(creator, feeLimit, callValue); + } else { + energyLimit = getAccountEnergyLimitWithFloatRatio(creator, feeLimit, callValue); + } } checkTokenValueAndId(tokenValue, tokenId); From 30e361f9a1ff1dfbd9c53eb58a9c8980512f827e Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 16 Sep 2021 18:03:02 +0800 Subject: [PATCH 276/341] feat: fix NodeManagerTest --- .../discover/node/NodeManagerTest.java | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/framework/src/test/java/org/tron/common/overlay/discover/node/NodeManagerTest.java b/framework/src/test/java/org/tron/common/overlay/discover/node/NodeManagerTest.java index a9f31639061..af091dfabfc 100644 --- a/framework/src/test/java/org/tron/common/overlay/discover/node/NodeManagerTest.java +++ b/framework/src/test/java/org/tron/common/overlay/discover/node/NodeManagerTest.java @@ -7,8 +7,11 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.junit.After; +import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Ignore; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -27,21 +30,22 @@ public class NodeManagerTest { private static final Logger logger = LoggerFactory.getLogger("Test"); - private Manager manager; - private NodeManager nodeManager; - private TronApplicationContext context; - private CommonParameter argsTest; - private Application appTest; + private static Manager manager; + private static NodeManager nodeManager; + private static TronApplicationContext context; + private static CommonParameter argsTest; + private static Application appTest; private Class nodeManagerClazz; + private static String dbPath = "NodeManagerTest"; /** * start the application. */ - @Before - public void init() { + @BeforeClass + public static void init() { argsTest = Args.getInstance(); - Args.setParam(new String[]{"--output-directory", "output-directory", "--debug"}, + Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); context = new TronApplicationContext(DefaultConfig.class); appTest = ApplicationFactory.create(context); @@ -53,11 +57,11 @@ public void init() { /** * destroy the context. */ - @After - public void destroy() { + @AfterClass + public static void destroy() { Args.clearParam(); context.destroy(); - if (FileUtil.deleteDir(new File("output-directory"))) { + if (FileUtil.deleteDir(new File(dbPath))) { logger.info("Release resources successful."); } else { logger.info("Release resources failure."); From 59b08ce2d475eede19a838d464154ef35c9e7145 Mon Sep 17 00:00:00 2001 From: sophiawang <1975054324@qq.com> Date: Thu, 16 Sep 2021 18:18:46 +0800 Subject: [PATCH 277/341] add test cases --- .../tvmnewcommand/newGrammar/EthGrammer.java | 22 +++++++++++++++++++ .../resources/soliditycode/EthGrammer.sol | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/EthGrammer.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/EthGrammer.java index bb49f07e1f1..5633f0ff936 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/EthGrammer.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/EthGrammer.java @@ -32,6 +32,9 @@ public class EthGrammer { private final String testNetAccountKey = Configuration.getByPath("testng.conf") .getString("foundationAccount.key2"); private final byte[] testNetAccountAddress = PublicMethed.getFinalAddress(testNetAccountKey); + private final String witnessKey001 = Configuration.getByPath("testng.conf") + .getString("witness.key1"); + private final byte[] witness001Address = PublicMethed.getFinalAddress(witnessKey001); byte[] contractC = null; byte[] contractD = null; byte[] create2Address; @@ -499,6 +502,25 @@ public void test15FixCreateStackDepth() { } + @Test(enabled = false, description = "test max Energy Limit For trigger Constant contract") + public void test16MaxEnergyLimitForConstant() { + String methedStr = "transfer(address)"; + String argsStr = "\"" + Base58.encode58Check(testNetAccountAddress) + "\""; + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(contractD, + methedStr, argsStr, false, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + System.out.println("transactionExtention: " + transactionExtention.toString()); + } + + @Test(enabled = true, description = "commit NO.47 value can be 1e17 if commit No.63 opened") + public void test17Commit47Value() { + HashMap proposalMap = new HashMap(); + proposalMap.put(47L, 100000000000000000L); + org.testng.Assert.assertTrue(PublicMethed.createProposal(witness001Address, witnessKey001, + proposalMap, blockingStubFull)); + } + /** * constructor. diff --git a/framework/src/test/resources/soliditycode/EthGrammer.sol b/framework/src/test/resources/soliditycode/EthGrammer.sol index 45c354ae12d..1be4d2d0881 100644 --- a/framework/src/test/resources/soliditycode/EthGrammer.sol +++ b/framework/src/test/resources/soliditycode/EthGrammer.sol @@ -174,7 +174,7 @@ contract D { } } - function deployef(bytes memory code) public{ + function deployef(bytes memory code) public payable{ address addr; assembly { addr := create(0, add(code, 0x20), mload(code)) From b7b944c02f4cbb8506fe12238ac7bb223ebdde8a Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 16 Sep 2021 19:20:17 +0800 Subject: [PATCH 278/341] test: try to fix NodeManagerTest --- .../discover/node/NodeManagerTest.java | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/framework/src/test/java/org/tron/common/overlay/discover/node/NodeManagerTest.java b/framework/src/test/java/org/tron/common/overlay/discover/node/NodeManagerTest.java index af091dfabfc..92eccfc5e83 100644 --- a/framework/src/test/java/org/tron/common/overlay/discover/node/NodeManagerTest.java +++ b/framework/src/test/java/org/tron/common/overlay/discover/node/NodeManagerTest.java @@ -6,17 +6,13 @@ import java.lang.reflect.Method; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import org.junit.After; import org.junit.AfterClass; import org.junit.Assert; -import org.junit.Before; import org.junit.BeforeClass; -import org.junit.Ignore; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; import org.tron.common.application.TronApplicationContext; import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.FileUtil; @@ -35,23 +31,32 @@ public class NodeManagerTest { private static TronApplicationContext context; private static CommonParameter argsTest; private static Application appTest; - private Class nodeManagerClazz; + private static Class nodeManagerClazz; private static String dbPath = "NodeManagerTest"; + static { + Args.setParam(new String[]{"-d", dbPath}, Constant.TEST_CONF); + context = new TronApplicationContext(DefaultConfig.class); + } /** * start the application. */ @BeforeClass public static void init() { - argsTest = Args.getInstance(); - Args.setParam(new String[]{"--output-directory", dbPath}, - Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - appTest = ApplicationFactory.create(context); - appTest.initServices(argsTest); - appTest.startServices(); - appTest.startup(); + // argsTest = Args.getInstance(); + // Args.setParam(new String[]{"--output-directory", dbPath}, + // Constant.TEST_CONF); + // context = new TronApplicationContext(DefaultConfig.class); + // appTest = ApplicationFactory.create(context); + // appTest.initServices(argsTest); + // appTest.startServices(); + // appTest.startup(); + try { + initManager(); + } catch (Exception e) { + + } } /** @@ -71,8 +76,8 @@ public static void destroy() { /** * init the managers. */ - @Before - public void initManager() throws Exception { + // @Before + public static void initManager() throws Exception { nodeManagerClazz = NodeManager.class; Constructor handlerConstructor = nodeManagerClazz.getConstructor(ChainBaseManager.class); From b8fac0e7f2a7850fbc0db639530db71ffe894109 Mon Sep 17 00:00:00 2001 From: liqi <1242201319@qq.com> Date: Thu, 16 Sep 2021 20:06:21 +0800 Subject: [PATCH 279/341] fix testcase --- .../dailybuild/jsonrpc/Accounts001.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java index 524ab5ddcf2..f93f46a9d48 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java @@ -46,6 +46,7 @@ public class Accounts001 extends JsonRpcBase { long size = 0; long gas = 0; long blockTimeStamp = 0; + long gasPriceFromHttp = 0; /** constructor. */ @BeforeClass(enabled = true) @@ -165,20 +166,19 @@ public void test07JsonRpcApiTestForEthGasPrice() throws Exception { responseContent = HttpMethed.parseResponseContent(response); responseContent.get("result"); String gasPrice = responseContent.get("result").toString().substring(2); - int gasPrice1 = Integer.parseInt(gasPrice, 16); - logger.info(String.valueOf(gasPrice1)); + long gasPriceFromJsonrpc = Long.parseLong(gasPrice, 16); + logger.info(String.valueOf(gasPriceFromJsonrpc)); response = HttpMethed.getChainParameter(httpFullNode); responseContent = HttpMethed.parseResponseContent(response); JSONArray temp; temp = responseContent.getJSONArray("chainParameter"); - int gasPrice2 = 0; for (int i = 0; i < temp.size(); i++) { if (temp.getJSONObject(i).get("key").equals("getEnergyFee")) { - gasPrice2 = temp.getJSONObject(i).getInteger("value"); + gasPriceFromHttp = temp.getJSONObject(i).getLong("value"); } } - logger.info(String.valueOf(gasPrice2)); - Assert.assertEquals(gasPrice1, gasPrice2); + logger.info("gasPriceFromHttp:" + gasPriceFromHttp); + Assert.assertEquals(gasPriceFromJsonrpc, gasPriceFromHttp); } @Test(enabled = true, description = "Json rpc api of eth_getBalance") @@ -340,10 +340,11 @@ public void test13JsonRpcApiTestForEthGetTransactionByBlockNumberAndIndex() thro logger.info("indexHex:" + indexHex); params.add(indexHex); JsonObject requestBody = getJsonRpcBody("eth_getTransactionByBlockNumberAndIndex", params); + logger.info("13requestBody:" + requestBody); response = getJsonRpc(jsonRpcNode, requestBody); responseContent = HttpMethed.parseResponseContent(response); result = responseContent.getJSONObject("result"); - logger.info("15 result" + result); + logger.info("13 result" + result); Map jsonrpcResult = new HashMap(); for (Map.Entry entry : result.entrySet()) { jsonrpcResult.put(entry.getKey(), entry.getValue()); @@ -542,6 +543,11 @@ public void test18JsonRpcApiTestForEthGetTransactionReceipt() throws Exception { Assert.assertEquals( resultFromTransactionReceipt.getString("to"), resultFromTransactionByBlockNumberAndIndex.getString("to")); + logger.info("effectiveGasPrice:" + resultFromTransactionReceipt.getString("effectiveGasPrice")); + logger.info("gasPriceFromHttp:" + Long.toHexString(gasPriceFromHttp)); + Assert.assertEquals( + resultFromTransactionReceipt.getString("effectiveGasPrice"), + "0x" + Long.toHexString(gasPriceFromHttp)); Assert.assertEquals( resultFromTransactionReceipt.getString("contractAddress").substring(2), trc20AddressHex.substring(2)); From 0d1070bc0a451cbc542459de301d8044d7194152 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 16 Sep 2021 23:01:35 +0800 Subject: [PATCH 280/341] typo --- .../org/tron/common/overlay/discover/node/NodeManagerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/test/java/org/tron/common/overlay/discover/node/NodeManagerTest.java b/framework/src/test/java/org/tron/common/overlay/discover/node/NodeManagerTest.java index 92eccfc5e83..d5706b847a0 100644 --- a/framework/src/test/java/org/tron/common/overlay/discover/node/NodeManagerTest.java +++ b/framework/src/test/java/org/tron/common/overlay/discover/node/NodeManagerTest.java @@ -55,7 +55,7 @@ public static void init() { try { initManager(); } catch (Exception e) { - + logger.error("init failed {}", e.getMessage()); } } From 129dc1f7e686357032177bb996afc16f51fa69bd Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 16 Sep 2021 23:17:09 +0800 Subject: [PATCH 281/341] feat: update NodeHandlerTest --- .../discover/node/NodeHandlerTest.java | 51 +++++++++---------- 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/framework/src/test/java/org/tron/common/overlay/discover/node/NodeHandlerTest.java b/framework/src/test/java/org/tron/common/overlay/discover/node/NodeHandlerTest.java index 8e14edeb0b2..98e5e6da913 100644 --- a/framework/src/test/java/org/tron/common/overlay/discover/node/NodeHandlerTest.java +++ b/framework/src/test/java/org/tron/common/overlay/discover/node/NodeHandlerTest.java @@ -3,14 +3,13 @@ import java.io.File; import java.lang.reflect.Constructor; import java.lang.reflect.Field; -import org.junit.After; +import org.junit.AfterClass; import org.junit.Assert; -import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; import org.tron.common.application.TronApplicationContext; import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.FileUtil; @@ -24,41 +23,40 @@ public class NodeHandlerTest { private static final Logger logger = LoggerFactory.getLogger("Test"); - private Manager dbManager; - private TronApplicationContext context; + private static Manager dbManager; + private static TronApplicationContext context; private Application appTest; private CommonParameter argsTest; - private Node currNode; - private Node oldNode; - private Node replaceNode; - private NodeHandler currHandler; - private NodeHandler oldHandler; - private NodeHandler replaceHandler; - private NodeManager nodeManager; + private static Node currNode; + private static Node oldNode; + private static Node replaceNode; + private static NodeHandler currHandler; + private static NodeHandler oldHandler; + private static NodeHandler replaceHandler; + private static NodeManager nodeManager; + private static String dbPath = "NodeHandlerTest"; + + static { + Args.setParam(new String[]{"-d", dbPath}, Constant.TEST_CONF); + context = new TronApplicationContext(DefaultConfig.class); + } /** * init the application. */ - @Before - public void init() { - argsTest = Args.getInstance(); - Args.setParam(new String[]{"--output-directory", "output-directory", "--debug"}, - Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - appTest = ApplicationFactory.create(context); - appTest.initServices(argsTest); - appTest.startServices(); - appTest.startup(); + @BeforeClass + public static void init() { + initNodes(); } /** * destroy the context. */ - @After - public void destroy() { + @AfterClass + public static void destroy() { Args.clearParam(); context.destroy(); - if (FileUtil.deleteDir(new File("output-directory"))) { + if (FileUtil.deleteDir(new File(dbPath))) { logger.info("Release resources successful."); } else { logger.info("Release resources failure."); @@ -68,8 +66,7 @@ public void destroy() { /** * init nodes. */ - @Before - public void initNodes() { + public static void initNodes() { dbManager = context.getBean(Manager.class); nodeManager = new NodeManager(context.getBean(ChainBaseManager.class)); String currNodeId = "74c11ffad1d59d7b1a56691a0b84a53f0791c92361357364f1d2537" From dfee1478b16ded0c4ae70cf9c41acfda2e0e6dcf Mon Sep 17 00:00:00 2001 From: liukai Date: Fri, 17 Sep 2021 12:10:33 +0800 Subject: [PATCH 282/341] add script url --- shell.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shell.md b/shell.md index 57fc62f7390..f7ff0a7d3e2 100644 --- a/shell.md +++ b/shell.md @@ -6,12 +6,12 @@ Using the `start.sh` script, you can quickly and easily run and build java-tron. If you already downloaded the `FullNode.jar`, you can use `start.sh` to run it, or if you have not downloaded java-tron source code or jar packages, you can use `start.sh` to download the source code, compile, run or get the latest release version in the form of a `jar package ` and run. +The script is available in the java-tron project at [github](https://github.com/tronprotocol/java-tron), or if you need a separate script: [start.sh](https://github.com/tronprotocol/java-tron/blob/develop/start. sh) + *** # Usage - - ## Examples * Start the `FullNode.jar` (`start.sh`, `config.conf` and `FullNode.jar` in the same directory.) From d8489030c6349fbbf3c8c0884281055957340e4c Mon Sep 17 00:00:00 2001 From: sophiawang <1975054324@qq.com> Date: Fri, 17 Sep 2021 14:25:44 +0800 Subject: [PATCH 283/341] add test case --- .../tvmnewcommand/newGrammar/EthGrammer02.java | 17 +++++++++++++++++ .../resources/soliditycode/EthGrammer02.sol | 2 ++ 2 files changed, 19 insertions(+) diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/EthGrammer02.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/EthGrammer02.java index 9fde98e2ac6..10b47c7793f 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/EthGrammer02.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/EthGrammer02.java @@ -80,6 +80,7 @@ public void beforeClass() { PublicMethed.waitProduceNextBlock(blockingStubFull); SmartContractOuterClass.SmartContract smartContract = PublicMethed.getContract(contractD, blockingStubFull); + Assert.assertEquals(1, smartContract.getVersion()); Assert.assertNotNull(smartContract.getAbi()); } @@ -522,6 +523,22 @@ public void test37DbKeyUseHigh16BytesAllBytesF() { Assert.assertEquals(value, result); } + @Test(enabled = true, description = "TransactionExtention has logs and internal_transactions") + public void test38ConstantLogEven() { + salt++; + String methedStr = "create2DeployEf(bytes,uint256)"; + String argsStr = "\"0x60fe60005360016000f3\"," + salt; + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(contractD, + methedStr, argsStr, false, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + Assert.assertEquals(true, transactionExtention.getResult().getResult()); + Assert.assertEquals("SUCESS", + transactionExtention.getTransaction().getRet(0).getRet().toString()); + Assert.assertEquals(1, transactionExtention.getLogsCount()); + Assert.assertEquals(1, transactionExtention.getInternalTransactionsCount()); + } + /** * constructor. */ diff --git a/framework/src/test/resources/soliditycode/EthGrammer02.sol b/framework/src/test/resources/soliditycode/EthGrammer02.sol index 8caa08d2d2d..d032b531fa6 100644 --- a/framework/src/test/resources/soliditycode/EthGrammer02.sol +++ b/framework/src/test/resources/soliditycode/EthGrammer02.sol @@ -1,6 +1,7 @@ contract D { constructor() public payable{} + event createAddress(address addr); function createDeployEf(bytes memory code) public returns(address addr){ address addr; assembly { @@ -20,6 +21,7 @@ contract D { revert(0, 0) } } + emit createAddress(addr); return addr; } From 35ece472cd5c6ac2dacbce6adc5b7a2d6c137365 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Fri, 17 Sep 2021 14:41:04 +0800 Subject: [PATCH 284/341] fix: set contractAddress if transaction was a contract creation in transactionReceipt --- .../core/services/jsonrpc/TransactionReceipt.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java index 530cbdd9e1c..b1f9d6d9fe0 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java @@ -15,6 +15,7 @@ import org.tron.protos.Protocol; import org.tron.protos.Protocol.ResourceReceipt; import org.tron.protos.Protocol.Transaction.Contract; +import org.tron.protos.Protocol.Transaction.Contract.ContractType; import org.tron.protos.Protocol.TransactionInfo; @JsonPropertyOrder(alphabetic = true) @@ -92,18 +93,21 @@ public TransactionReceipt(Protocol.Block block, TransactionInfo txInfo, Wallet w transactionHash = ByteArray.toJsonHex(txInfo.getId().toByteArray()); effectiveGasPrice = ByteArray.toJsonHex(wallet.getEnergyFee(blockCapsule.getTimeStamp())); + from = null; + to = null; + contractAddress = null; + if (transaction != null && !transaction.getRawData().getContractList().isEmpty()) { Contract contract = transaction.getRawData().getContract(0); byte[] fromByte = TransactionCapsule.getOwner(contract); byte[] toByte = getToAddress(transaction); from = ByteArray.toJsonHexAddress(fromByte); to = ByteArray.toJsonHexAddress(toByte); - } else { - from = null; - to = null; - } - contractAddress = ByteArray.toJsonHexAddress(txInfo.getContractAddress().toByteArray()); + if (contract.getType() == ContractType.CreateSmartContract) { + contractAddress = ByteArray.toJsonHexAddress(txInfo.getContractAddress().toByteArray()); + } + } // logs List logList = new ArrayList<>(); From f59caeef22dc3fe92f56bb548ec11f6f2e755f95 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Fri, 17 Sep 2021 16:50:56 +0800 Subject: [PATCH 285/341] feat: set contractAddress if transaction was a contract creation in transactionReceipt --- .../capsule/TransactionLogTriggerCapsule.java | 129 ++++++++++-------- 1 file changed, 74 insertions(+), 55 deletions(-) diff --git a/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java b/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java index a5aa98e0c8d..782b847f702 100644 --- a/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java +++ b/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java @@ -25,6 +25,8 @@ import org.tron.core.capsule.TransactionCapsule; import org.tron.core.db.TransactionTrace; import org.tron.protos.Protocol; +import org.tron.protos.Protocol.Transaction; +import org.tron.protos.Protocol.Transaction.Contract.ContractType; import org.tron.protos.Protocol.TransactionInfo; import org.tron.protos.contract.AssetIssueContractOuterClass.TransferAssetContract; import org.tron.protos.contract.BalanceContract.TransferContract; @@ -67,15 +69,19 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule transactionLogTrigger.setResult(trxCapsule.getContractRet().toString()); } - if (Objects.nonNull(trxCapsule.getInstance().getRawData())) { + Transaction.raw rawData = trxCapsule.getInstance().getRawData(); + ContractType contractType = null; + + if (Objects.nonNull(rawData)) { // fee limit - transactionLogTrigger.setFeeLimit(trxCapsule.getInstance().getRawData().getFeeLimit()); + transactionLogTrigger.setFeeLimit(rawData.getFeeLimit()); - Protocol.Transaction.Contract contract = trxCapsule.getInstance().getRawData().getContract(0); + Protocol.Transaction.Contract contract = rawData.getContract(0); Any contractParameter = null; + // contract type if (Objects.nonNull(contract)) { - Protocol.Transaction.Contract.ContractType contractType = contract.getType(); + contractType = contract.getType(); if (Objects.nonNull(contractType)) { transactionLogTrigger.setContractType(contractType.toString()); } @@ -87,66 +93,74 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule if (Objects.nonNull(contractParameter) && Objects.nonNull(contract)) { try { - if (contract.getType() == TransferContract) { - TransferContract contractTransfer = contractParameter.unpack(TransferContract.class); - - if (Objects.nonNull(contractTransfer)) { - transactionLogTrigger.setAssetName("trx"); + switch (contractType) { + case TransferContract: + TransferContract contractTransfer = contractParameter.unpack(TransferContract.class); - if (Objects.nonNull(contractTransfer.getOwnerAddress())) { - transactionLogTrigger.setFromAddress(StringUtil - .encode58Check(contractTransfer.getOwnerAddress().toByteArray())); - } - - if (Objects.nonNull(contractTransfer.getToAddress())) { - transactionLogTrigger.setToAddress( - StringUtil.encode58Check(contractTransfer.getToAddress().toByteArray())); - } + if (Objects.nonNull(contractTransfer)) { + transactionLogTrigger.setAssetName("trx"); - transactionLogTrigger.setAssetAmount(contractTransfer.getAmount()); - } + if (Objects.nonNull(contractTransfer.getOwnerAddress())) { + transactionLogTrigger.setFromAddress(StringUtil + .encode58Check(contractTransfer.getOwnerAddress().toByteArray())); + } - } else if (contract.getType() == TransferAssetContract) { - TransferAssetContract contractTransfer = contractParameter - .unpack(TransferAssetContract.class); + if (Objects.nonNull(contractTransfer.getToAddress())) { + transactionLogTrigger.setToAddress( + StringUtil.encode58Check(contractTransfer.getToAddress().toByteArray())); + } - if (Objects.nonNull(contractTransfer)) { - if (Objects.nonNull(contractTransfer.getAssetName())) { - transactionLogTrigger.setAssetName(contractTransfer.getAssetName().toStringUtf8()); + transactionLogTrigger.setAssetAmount(contractTransfer.getAmount()); } + break; + case TransferAssetContract: + TransferAssetContract contractAssetTransfer = contractParameter + .unpack(TransferAssetContract.class); + + if (Objects.nonNull(contractAssetTransfer)) { + if (Objects.nonNull(contractAssetTransfer.getAssetName())) { + transactionLogTrigger + .setAssetName(contractAssetTransfer.getAssetName().toStringUtf8()); + } + + if (Objects.nonNull(contractAssetTransfer.getOwnerAddress())) { + transactionLogTrigger.setFromAddress( + StringUtil + .encode58Check(contractAssetTransfer.getOwnerAddress().toByteArray())); + } + + if (Objects.nonNull(contractAssetTransfer.getToAddress())) { + transactionLogTrigger.setToAddress(StringUtil + .encode58Check(contractAssetTransfer.getToAddress().toByteArray())); + } + transactionLogTrigger.setAssetAmount(contractAssetTransfer.getAmount()); + } + break; + case TriggerSmartContract: + TriggerSmartContract triggerSmartContract = contractParameter + .unpack(TriggerSmartContract.class); - if (Objects.nonNull(contractTransfer.getOwnerAddress())) { + if (Objects.nonNull(triggerSmartContract.getOwnerAddress())) { transactionLogTrigger.setFromAddress( - StringUtil.encode58Check(contractTransfer.getOwnerAddress().toByteArray())); + StringUtil.encode58Check(triggerSmartContract.getOwnerAddress().toByteArray())); } - if (Objects.nonNull(contractTransfer.getToAddress())) { + if (Objects.nonNull(triggerSmartContract.getContractAddress())) { transactionLogTrigger.setToAddress(StringUtil - .encode58Check(contractTransfer.getToAddress().toByteArray())); + .encode58Check(triggerSmartContract.getContractAddress().toByteArray())); } - transactionLogTrigger.setAssetAmount(contractTransfer.getAmount()); - } - } else if (contract.getType() == TriggerSmartContract) { - TriggerSmartContract triggerSmartContract = contractParameter - .unpack(TriggerSmartContract.class); - - if (Objects.nonNull(triggerSmartContract.getOwnerAddress())) { - transactionLogTrigger.setFromAddress( - StringUtil.encode58Check(triggerSmartContract.getOwnerAddress().toByteArray())); - } - - if (Objects.nonNull(triggerSmartContract.getContractAddress())) { - transactionLogTrigger.setToAddress(StringUtil - .encode58Check(triggerSmartContract.getContractAddress().toByteArray())); - } - } else if (contract.getType() == CreateSmartContract) { - CreateSmartContract createSmartContract = contractParameter - .unpack(CreateSmartContract.class); - - if (Objects.nonNull(createSmartContract.getOwnerAddress())) { - transactionLogTrigger.setFromAddress( - StringUtil.encode58Check(createSmartContract.getOwnerAddress().toByteArray())); - } + break; + case CreateSmartContract: + CreateSmartContract createSmartContract = contractParameter + .unpack(CreateSmartContract.class); + + if (Objects.nonNull(createSmartContract.getOwnerAddress())) { + transactionLogTrigger.setFromAddress( + StringUtil.encode58Check(createSmartContract.getOwnerAddress().toByteArray())); + } + break; + default: + break; } } catch (Exception e) { logger.error("failed to load transferAssetContract, error '{}'", e.getMessage()); @@ -179,8 +193,13 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule } if (Objects.nonNull(contractAddress) && contractAddress.size() > 0) { - transactionLogTrigger - .setContractAddress(StringUtil.encode58Check((contractAddress.toByteArray()))); + if (Objects.nonNull(transactionInfo) + && contractType != null && contractType != CreateSmartContract) { + transactionLogTrigger.setContractAddress(null); + } else { + transactionLogTrigger + .setContractAddress(StringUtil.encode58Check((contractAddress.toByteArray()))); + } } // internal transaction From d8b2836c920174c3ff7160f535f68c185a9c25c9 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Fri, 17 Sep 2021 18:15:13 +0800 Subject: [PATCH 286/341] feat: add solidified to control if trigger solidity block or transaction --- .../tron/common/logsfilter/TriggerConfig.java | 5 ++++ .../common/logsfilter/EventPluginLoader.java | 20 ++++++++++++++ .../java/org/tron/core/config/args/Args.java | 5 ++++ .../main/java/org/tron/core/db/Manager.java | 26 ++++++++++++++++++- 4 files changed, 55 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/org/tron/common/logsfilter/TriggerConfig.java b/common/src/main/java/org/tron/common/logsfilter/TriggerConfig.java index 98cd72e5e9d..70986d7d334 100644 --- a/common/src/main/java/org/tron/common/logsfilter/TriggerConfig.java +++ b/common/src/main/java/org/tron/common/logsfilter/TriggerConfig.java @@ -25,11 +25,16 @@ public class TriggerConfig { @Setter private boolean ethCompatible; + @Getter + @Setter + private boolean solidified; + public TriggerConfig() { triggerName = ""; enabled = false; topic = ""; redundancy = false; ethCompatible = false; + solidified = false; } } \ No newline at end of file diff --git a/framework/src/main/java/org/tron/common/logsfilter/EventPluginLoader.java b/framework/src/main/java/org/tron/common/logsfilter/EventPluginLoader.java index e3f37b81c3f..c8019dac93a 100644 --- a/framework/src/main/java/org/tron/common/logsfilter/EventPluginLoader.java +++ b/framework/src/main/java/org/tron/common/logsfilter/EventPluginLoader.java @@ -44,8 +44,12 @@ public class EventPluginLoader { private boolean blockLogTriggerEnable = false; + private boolean blockLogTriggerSolidified = false; + private boolean transactionLogTriggerEnable = false; + private boolean transactionLogTriggerSolidified = false; + private boolean transactionLogTriggerEthCompatible = false; private boolean contractEventTriggerEnable = false; @@ -247,8 +251,12 @@ private void setSingleTriggerConfig(TriggerConfig triggerConfig) { if (EventPluginConfig.BLOCK_TRIGGER_NAME.equalsIgnoreCase(triggerConfig.getTriggerName())) { if (triggerConfig.isEnabled()) { blockLogTriggerEnable = true; + if (triggerConfig.isSolidified()) { + blockLogTriggerSolidified = true; + } } else { blockLogTriggerEnable = false; + blockLogTriggerSolidified = false; } if (!useNativeQueue) { @@ -262,9 +270,13 @@ private void setSingleTriggerConfig(TriggerConfig triggerConfig) { if (triggerConfig.isEthCompatible()) { transactionLogTriggerEthCompatible = true; } + if (triggerConfig.isSolidified()) { + transactionLogTriggerSolidified = true; + } } else { transactionLogTriggerEnable = false; transactionLogTriggerEthCompatible = false; + transactionLogTriggerSolidified = false; } if (!useNativeQueue) { @@ -350,6 +362,10 @@ public synchronized boolean isBlockLogTriggerEnable() { return blockLogTriggerEnable; } + public synchronized boolean isBlockLogTriggerSolidified() { + return blockLogTriggerSolidified; + } + public synchronized boolean isSolidityTriggerEnable() { return solidityTriggerEnable; } @@ -374,6 +390,10 @@ public synchronized boolean isTransactionLogTriggerEthCompatible() { return transactionLogTriggerEthCompatible; } + public synchronized boolean isTransactionLogTriggerSolidified() { + return transactionLogTriggerSolidified; + } + public synchronized boolean isContractEventTriggerEnable() { return contractEventTriggerEnable; } diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index 2c766381b26..d8ae045f908 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -974,6 +974,11 @@ private static TriggerConfig createTriggerConfig(ConfigObject triggerObject) { triggerConfig.setEthCompatible("true".equalsIgnoreCase(ethCompatible)); } + if (triggerObject.containsKey("solidified")) { + String solidified = triggerObject.get("solidified").unwrapped().toString(); + triggerConfig.setSolidified("true".equalsIgnoreCase(solidified)); + } + return triggerConfig; } diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 1d678b01ada..f5105a5e313 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -1729,8 +1729,21 @@ private void postSolidityTrigger(final long latestSolidifiedBlockNumber) { } } - private void postBlockTrigger(final BlockCapsule newBlock) { + private void postBlockTrigger(final BlockCapsule blockCapsule) { + BlockCapsule newBlock = blockCapsule; + if (eventPluginLoaded && EventPluginLoader.getInstance().isBlockLogTriggerEnable()) { + if (EventPluginLoader.getInstance().isBlockLogTriggerSolidified()) { + long solidityBlkNum = getDynamicPropertiesStore().getLatestSolidifiedBlockNum(); + try { + newBlock = chainBaseManager + .getBlockByNum(solidityBlkNum); + } catch (Exception e) { + logger.error("postBlockTrigger getBlockByNum blkNum={} except, error is {}", + solidityBlkNum, e.getMessage()); + } + } + BlockLogTriggerCapsule blockLogTriggerCapsule = new BlockLogTriggerCapsule(newBlock); blockLogTriggerCapsule.setLatestSolidifiedBlockNumber(getDynamicPropertiesStore() .getLatestSolidifiedBlockNum()); @@ -1740,6 +1753,17 @@ private void postBlockTrigger(final BlockCapsule newBlock) { } if (eventPluginLoaded && EventPluginLoader.getInstance().isTransactionLogTriggerEnable()) { + if (EventPluginLoader.getInstance().isTransactionLogTriggerSolidified()) { + long solidityBlkNum = getDynamicPropertiesStore().getLatestSolidifiedBlockNum(); + try { + newBlock = chainBaseManager + .getBlockByNum(solidityBlkNum); + } catch (Exception e) { + logger.error("postBlockTrigger getBlockByNum blkNum={} except, error is {}", + solidityBlkNum, e.getMessage()); + } + } + List transactionCapsuleList = newBlock.getTransactions(); // get transactionInfoList From a905dae08e3e4907aa5ef0283cb60250f6f9a83e Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Sat, 18 Sep 2021 11:28:41 +0800 Subject: [PATCH 287/341] feat: set solidity after block --- framework/src/main/java/org/tron/core/db/Manager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index f5105a5e313..04e07f589f4 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -1050,10 +1050,10 @@ public synchronized void pushBlock(final BlockCapsule block) applyBlock(newBlock, txs); tmpSession.commit(); - // if event subscribe is enabled, post solidity trigger to queue - postSolidityTrigger(getDynamicPropertiesStore().getLatestSolidifiedBlockNum()); // if event subscribe is enabled, post block trigger to queue postBlockTrigger(newBlock); + // if event subscribe is enabled, post solidity trigger to queue + postSolidityTrigger(getDynamicPropertiesStore().getLatestSolidifiedBlockNum()); } catch (Throwable throwable) { logger.error(throwable.getMessage(), throwable); khaosDb.removeBlk(block.getBlockId()); From 9a565180e76a8f19680b1e871ed73cf1374f8638 Mon Sep 17 00:00:00 2001 From: liukai Date: Sat, 18 Sep 2021 12:27:04 +0800 Subject: [PATCH 288/341] modify format of shell.md --- shell.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell.md b/shell.md index f7ff0a7d3e2..df7d01e7cd9 100644 --- a/shell.md +++ b/shell.md @@ -6,7 +6,7 @@ Using the `start.sh` script, you can quickly and easily run and build java-tron. If you already downloaded the `FullNode.jar`, you can use `start.sh` to run it, or if you have not downloaded java-tron source code or jar packages, you can use `start.sh` to download the source code, compile, run or get the latest release version in the form of a `jar package ` and run. -The script is available in the java-tron project at [github](https://github.com/tronprotocol/java-tron), or if you need a separate script: [start.sh](https://github.com/tronprotocol/java-tron/blob/develop/start. sh) +The script is available in the java-tron project at [github](https://github.com/tronprotocol/java-tron), or if you need a separate script: [start.sh](https://github.com/tronprotocol/java-tron/blob/develop/start.sh) *** From ca39338474d7a69f57faa3fe1edc4d2f634d5932 Mon Sep 17 00:00:00 2001 From: liqi <1242201319@qq.com> Date: Sat, 18 Sep 2021 17:24:03 +0800 Subject: [PATCH 289/341] fix testcase --- .../stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java index f93f46a9d48..24f58ac20fd 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java @@ -548,9 +548,10 @@ public void test18JsonRpcApiTestForEthGetTransactionReceipt() throws Exception { Assert.assertEquals( resultFromTransactionReceipt.getString("effectiveGasPrice"), "0x" + Long.toHexString(gasPriceFromHttp)); - Assert.assertEquals( - resultFromTransactionReceipt.getString("contractAddress").substring(2), - trc20AddressHex.substring(2)); + /* Assert.assertEquals( + resultFromTransactionReceipt.getString("contractAddress").substring(2), + trc20AddressHex.substring(2));*/ + Assert.assertNull(resultFromTransactionReceipt.getString("contractAddress")); Assert.assertEquals( resultFromTransactionReceipt.getString("logsBloom"), "0x000000000000000000000000000000000000000000000000000000000000" From 2d8d3ef688039089a48c49f4edd13dfb17604bd2 Mon Sep 17 00:00:00 2001 From: liqi <1242201319@qq.com> Date: Sat, 18 Sep 2021 17:56:17 +0800 Subject: [PATCH 290/341] fix testcase --- .../stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java index 24f58ac20fd..37f06ef8c80 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java @@ -588,8 +588,8 @@ public void test18JsonRpcApiTestForEthGetTransactionReceipt() throws Exception { logs.getJSONObject(0).getString("transactionHash"), resultFromTransactionReceipt.getString("transactionHash")); Assert.assertEquals( - logs.getJSONObject(0).getString("address"), - resultFromTransactionReceipt.getString("contractAddress")); + logs.getJSONObject(0).getString("address"),resultFromTransactionReceipt.getString("to") + ); response = HttpMethed.getTransactionInfoByBlocknum(httpFullNode, blockNumForTrc20); List responseContent1 = HttpMethed.parseResponseContentArray(response); logger.info("responseContent1:" + responseContent1); From bbcbc1532d8f2b822ee75652b975b2b768313a4d Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Sat, 18 Sep 2021 18:24:29 +0800 Subject: [PATCH 291/341] feat: add api getenergyprices to fullnode and solidity --- .../src/main/java/org/tron/core/Wallet.java | 10 +++++ .../services/http/FullNodeHttpApiService.java | 3 ++ .../services/http/GetEnergyPricesServlet.java | 37 +++++++++++++++++++ .../GetEnergyPricesOnSolidityServlet.java | 27 ++++++++++++++ .../solidity/HttpApiOnSolidityService.java | 5 +++ 5 files changed, 82 insertions(+) create mode 100644 framework/src/main/java/org/tron/core/services/http/GetEnergyPricesServlet.java create mode 100644 framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetEnergyPricesOnSolidityServlet.java diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index 1aa7a8223db..b08f8eb74ef 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -3886,6 +3886,16 @@ public long getEnergyFee(long timestamp) { } } + public String getEnergyPrices() { + try { + return chainBaseManager.getDynamicPropertiesStore().getEnergyPriceHistory(); + } catch (Exception e) { + logger.error("getEnergyPrices failed, error is {}", e.getMessage()); + } + + return ""; + } + public String getCoinbase() { if (!CommonParameter.getInstance().isWitness()) { return null; diff --git a/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java b/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java index 0af821f972d..40890fc7c79 100644 --- a/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java +++ b/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java @@ -287,6 +287,8 @@ public class FullNodeHttpApiService implements Service { private GetTransactionListFromPendingServlet getTransactionListFromPendingServlet; @Autowired private GetPendingSizeServlet getPendingSizeServlet; + @Autowired + private GetEnergyPricesServlet getEnergyPricesServlet; private static String getParamsFile(String fileName) { InputStream in = Thread.currentThread().getContextClassLoader() @@ -532,6 +534,7 @@ public void start() { context.addServlet(new ServletHolder(getTransactionListFromPendingServlet), "/wallet/gettransactionlistfrompending"); context.addServlet(new ServletHolder(getPendingSizeServlet), "/wallet/getpendingsize"); + context.addServlet(new ServletHolder(getEnergyPricesServlet), "/wallet/getenergyprices"); int maxHttpConnectNumber = Args.getInstance().getMaxHttpConnectNumber(); if (maxHttpConnectNumber > 0) { diff --git a/framework/src/main/java/org/tron/core/services/http/GetEnergyPricesServlet.java b/framework/src/main/java/org/tron/core/services/http/GetEnergyPricesServlet.java new file mode 100644 index 00000000000..36129d8ffdb --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/http/GetEnergyPricesServlet.java @@ -0,0 +1,37 @@ +package org.tron.core.services.http; + +import com.alibaba.fastjson.JSONObject; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.core.Wallet; + + +@Component +@Slf4j(topic = "API") +public class GetEnergyPricesServlet extends RateLimiterServlet { + + @Autowired + private Wallet wallet; + + protected void doGet(HttpServletRequest request, HttpServletResponse response) { + try { + String reply = wallet.getEnergyPrices(); + if (reply != null) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("prices", reply); + response.getWriter().println(jsonObject); + } else { + response.getWriter().println("{}"); + } + } catch (Exception e) { + Util.processError(e, response); + } + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) { + doGet(request, response); + } +} diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetEnergyPricesOnSolidityServlet.java b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetEnergyPricesOnSolidityServlet.java new file mode 100644 index 00000000000..b9d4fb765f6 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetEnergyPricesOnSolidityServlet.java @@ -0,0 +1,27 @@ +package org.tron.core.services.interfaceOnSolidity.http; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.core.services.http.GetEnergyPricesServlet; +import org.tron.core.services.interfaceOnSolidity.WalletOnSolidity; + + +@Component +@Slf4j(topic = "API") +public class GetEnergyPricesOnSolidityServlet extends GetEnergyPricesServlet { + + @Autowired + private WalletOnSolidity walletOnSolidity; + + protected void doGet(HttpServletRequest request, HttpServletResponse response) { + walletOnSolidity.futureGet(() -> super.doGet(request, response)); + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) { + walletOnSolidity.futureGet(() -> super.doPost(request, response)); + } +} + diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java index e2ca9005a4b..2541773876a 100644 --- a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java @@ -30,6 +30,7 @@ import org.tron.core.services.interfaceOnSolidity.http.GetBurnTrxOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.GetDelegatedResourceAccountIndexOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.GetDelegatedResourceOnSolidityServlet; +import org.tron.core.services.interfaceOnSolidity.http.GetEnergyPricesOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.GetExchangeByIdOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.GetMarketOrderByAccountOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.GetMarketOrderByIdOnSolidityServlet; @@ -146,6 +147,8 @@ public class HttpApiOnSolidityService implements Service { private GetMarketOrderListByPairOnSolidityServlet getMarketOrderListByPairOnSolidityServlet; @Autowired private GetMarketPairListOnSolidityServlet getMarketPairListOnSolidityServlet; + @Autowired + private GetEnergyPricesOnSolidityServlet getEnergyPricesOnSolidityServlet; @Autowired private LiteFnQueryHttpFilter liteFnQueryHttpFilter; @@ -252,6 +255,8 @@ public void start() { context.addServlet(new ServletHolder(getRewardServlet), "/walletsolidity/getReward"); context .addServlet(new ServletHolder(getBurnTrxOnSolidityServlet), "/walletsolidity/getburntrx"); + context.addServlet(new ServletHolder(getEnergyPricesOnSolidityServlet), + "/walletsolidity/getenergyprices"); // filters the specified APIs // when node is lite fullnode and openHistoryQueryWhenLiteFN is false From 6296005508f22131686276cbef09ea1e9dd6b2de Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Sat, 18 Sep 2021 21:19:49 +0800 Subject: [PATCH 292/341] typo --- framework/src/main/java/org/tron/core/db/Manager.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 04e07f589f4..28c1342c107 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -1802,8 +1802,9 @@ private void postBlockTrigger(final BlockCapsule blockCapsule) { cumulativeLogCount += transactionInfo.getLogCount(); } } else { - logger.error("postBlockTrigger blockNum={} the sizes of transactionInfoList " - + "and transactionCapsuleList are not equal", newBlock.getNum()); + logger.error("postBlockTrigger blockNum={} has no transactions or " + + "the sizes of transactionInfoList and transactionCapsuleList are not equal", + newBlock.getNum()); for (TransactionCapsule e : newBlock.getTransactions()) { postTransactionTrigger(e, newBlock); } From 0036c325e8b81442dc6ec64e115143ec911cbcd2 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Sat, 18 Sep 2021 21:52:38 +0800 Subject: [PATCH 293/341] feat: update check to ignore log --- framework/src/main/java/org/tron/core/db/Manager.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 28c1342c107..dbdd54c3626 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -1768,9 +1768,8 @@ private void postBlockTrigger(final BlockCapsule blockCapsule) { // get transactionInfoList if (EventPluginLoader.getInstance().isTransactionLogTriggerEthCompatible()) { - TransactionInfoList transactionInfoList = null; + TransactionInfoList transactionInfoList = TransactionInfoList.newBuilder().build(); TransactionInfoList.Builder transactionInfoListBuilder = TransactionInfoList.newBuilder(); - long energyUnitPrice = chainBaseManager.getDynamicPropertiesStore().getEnergyFee(); try { TransactionRetCapsule result = chainBaseManager.getTransactionRetStore() @@ -1788,10 +1787,11 @@ private void postBlockTrigger(final BlockCapsule blockCapsule) { newBlock.getNum(), e.getMessage()); } - if (transactionInfoList != null - && transactionCapsuleList.size() == transactionInfoList.getTransactionInfoCount()) { + if (transactionCapsuleList.size() == transactionInfoList.getTransactionInfoCount()) { long cumulativeEnergyUsed = 0; long cumulativeLogCount = 0; + long energyUnitPrice = chainBaseManager.getDynamicPropertiesStore().getEnergyFee(); + for (int i = 0; i < transactionCapsuleList.size(); i++) { TransactionInfo transactionInfo = transactionInfoList.getTransactionInfo(i); TransactionCapsule transactionCapsule = transactionCapsuleList.get(i); From e36748b7bbb31ce9fc253ccbe5c36d651ad11c34 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Sun, 19 Sep 2021 18:37:08 +0800 Subject: [PATCH 294/341] typo --- .../logsfilter/capsule/TransactionLogTriggerCapsule.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java b/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java index 782b847f702..2171b5ac725 100644 --- a/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java +++ b/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java @@ -1,9 +1,6 @@ package org.tron.common.logsfilter.capsule; import static org.tron.protos.Protocol.Transaction.Contract.ContractType.CreateSmartContract; -import static org.tron.protos.Protocol.Transaction.Contract.ContractType.TransferAssetContract; -import static org.tron.protos.Protocol.Transaction.Contract.ContractType.TransferContract; -import static org.tron.protos.Protocol.Transaction.Contract.ContractType.TriggerSmartContract; import com.google.protobuf.Any; import com.google.protobuf.ByteString; From 902b8db7820f59ced6647e4f512a907009d52c62 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 22 Sep 2021 11:22:43 +0800 Subject: [PATCH 295/341] feat: add getenergyprices in pbft --- .../http/GetEnergyPricesOnPBFTServlet.java | 26 +++++++++++++++++++ .../http/PBFT/HttpApiOnPBFTService.java | 5 ++++ 2 files changed, 31 insertions(+) create mode 100644 framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/GetEnergyPricesOnPBFTServlet.java diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/GetEnergyPricesOnPBFTServlet.java b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/GetEnergyPricesOnPBFTServlet.java new file mode 100644 index 00000000000..4cf8ad06b27 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/GetEnergyPricesOnPBFTServlet.java @@ -0,0 +1,26 @@ +package org.tron.core.services.interfaceOnPBFT.http; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.core.services.http.GetEnergyPricesServlet; +import org.tron.core.services.interfaceOnPBFT.WalletOnPBFT; + + +@Component +@Slf4j(topic = "API") +public class GetEnergyPricesOnPBFTServlet extends GetEnergyPricesServlet { + + @Autowired + private WalletOnPBFT walletOnPBFT; + + protected void doGet(HttpServletRequest request, HttpServletResponse response) { + walletOnPBFT.futureGet(() -> super.doGet(request, response)); + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) { + walletOnPBFT.futureGet(() -> super.doPost(request, response)); + } +} diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/PBFT/HttpApiOnPBFTService.java b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/PBFT/HttpApiOnPBFTService.java index e080700c214..9a953a2adb2 100644 --- a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/PBFT/HttpApiOnPBFTService.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/http/PBFT/HttpApiOnPBFTService.java @@ -28,6 +28,7 @@ import org.tron.core.services.interfaceOnPBFT.http.GetBurnTrxOnPBFTServlet; import org.tron.core.services.interfaceOnPBFT.http.GetDelegatedResourceAccountIndexOnPBFTServlet; import org.tron.core.services.interfaceOnPBFT.http.GetDelegatedResourceOnPBFTServlet; +import org.tron.core.services.interfaceOnPBFT.http.GetEnergyPricesOnPBFTServlet; import org.tron.core.services.interfaceOnPBFT.http.GetExchangeByIdOnPBFTServlet; import org.tron.core.services.interfaceOnPBFT.http.GetMarketOrderByAccountOnPBFTServlet; import org.tron.core.services.interfaceOnPBFT.http.GetMarketOrderByIdOnPBFTServlet; @@ -147,6 +148,8 @@ public class HttpApiOnPBFTService implements Service { isShieldedTRC20ContractNoteSpentOnPBFTServlet; @Autowired private GetBurnTrxOnPBFTServlet getBurnTrxOnPBFTServlet; + @Autowired + private GetEnergyPricesOnPBFTServlet getEnergyPricesOnPBFTServlet; @Override public void init() { @@ -232,6 +235,8 @@ public void start() { "/isshieldedtrc20contractnotespent"); context.addServlet(new ServletHolder(getBurnTrxOnPBFTServlet), "/getburntrx"); + context.addServlet(new ServletHolder(getEnergyPricesOnPBFTServlet), + "/getenergyprices"); int maxHttpConnectNumber = Args.getInstance().getMaxHttpConnectNumber(); if (maxHttpConnectNumber > 0) { From 9c5d2beb645025a0d670320bb218cd13b8dca4f9 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Wed, 22 Sep 2021 12:27:08 +0800 Subject: [PATCH 296/341] opt witness valid function --- framework/src/main/java/org/tron/core/db/Manager.java | 4 ---- .../src/main/java/org/tron/core/net/TronNetDelegate.java | 8 +------- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index a1a4b415d7a..114946340af 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -926,10 +926,6 @@ public List getVerifyTxs(BlockCapsule block) { return txs; } - public boolean validWitness(final BlockCapsule block) { - return consensus.validBlock(block); - } - /** * save a block. */ diff --git a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java index f19b9df9ebf..0787981893d 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java +++ b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java @@ -281,13 +281,7 @@ public boolean validBlock(BlockCapsule block) throws P2pException { "time:" + time + ",block time:" + block.getTimeStamp()); } validSignature(block); - long headNum = getHeadBlockId().getNum(); - boolean flag = dbManager.validWitness(block); - if (!flag && block.getNum() - headNum <= 1) { - throw new P2pException(TypeEnum.BAD_BLOCK, - "block num:" + block.getNum() + ",head num:" + headNum); - } - return flag; + return witnessScheduleStore.getActiveWitnesses().contains(block.getWitnessAddress()); } public PbftSignCapsule getBlockPbftCommitData(long blockNum) { From af818378091b82a10174b40e9a8b06ac6002ca2e Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 22 Sep 2021 13:32:50 +0800 Subject: [PATCH 297/341] typo --- .../tron/common/logsfilter/TriggerConfig.java | 6 ++-- .../trigger/TransactionLogTrigger.java | 12 +++---- .../capsule/TransactionLogTriggerCapsule.java | 33 +++++++++---------- .../src/main/java/org/tron/core/Wallet.java | 2 +- 4 files changed, 26 insertions(+), 27 deletions(-) diff --git a/common/src/main/java/org/tron/common/logsfilter/TriggerConfig.java b/common/src/main/java/org/tron/common/logsfilter/TriggerConfig.java index 70986d7d334..d76db47c40d 100644 --- a/common/src/main/java/org/tron/common/logsfilter/TriggerConfig.java +++ b/common/src/main/java/org/tron/common/logsfilter/TriggerConfig.java @@ -33,8 +33,8 @@ public TriggerConfig() { triggerName = ""; enabled = false; topic = ""; - redundancy = false; - ethCompatible = false; - solidified = false; + redundancy = false; // event will also write to log + ethCompatible = false; // add eth compatible fields, just for transaction now + solidified = false; // just write solidified data, just for block and transaction now } } \ No newline at end of file diff --git a/common/src/main/java/org/tron/common/logsfilter/trigger/TransactionLogTrigger.java b/common/src/main/java/org/tron/common/logsfilter/trigger/TransactionLogTrigger.java index 9fdc37a63de..dec4170efb8 100644 --- a/common/src/main/java/org/tron/common/logsfilter/trigger/TransactionLogTrigger.java +++ b/common/src/main/java/org/tron/common/logsfilter/trigger/TransactionLogTrigger.java @@ -11,9 +11,6 @@ public class TransactionLogTrigger extends Trigger { private String transactionId; @Getter @Setter - private int transactionIndex; - @Getter - @Setter private String blockHash; @Getter @Setter @@ -32,9 +29,6 @@ public class TransactionLogTrigger extends Trigger { private long energyUsageTotal; @Getter @Setter - private long cumulativeEnergyUsed; - @Getter - @Setter private long netUsage; @Getter @Setter @@ -83,6 +77,12 @@ public class TransactionLogTrigger extends Trigger { private String data; @Getter @Setter + private int transactionIndex; + @Getter + @Setter + private long cumulativeEnergyUsed; + @Getter + @Setter private long preCumulativeLogCount; @Getter @Setter diff --git a/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java b/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java index 2171b5ac725..8600cb6ef8c 100644 --- a/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java +++ b/framework/src/main/java/org/tron/common/logsfilter/capsule/TransactionLogTriggerCapsule.java @@ -92,45 +92,45 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule try { switch (contractType) { case TransferContract: - TransferContract contractTransfer = contractParameter.unpack(TransferContract.class); + TransferContract transferContract = contractParameter.unpack(TransferContract.class); - if (Objects.nonNull(contractTransfer)) { + if (Objects.nonNull(transferContract)) { transactionLogTrigger.setAssetName("trx"); - if (Objects.nonNull(contractTransfer.getOwnerAddress())) { + if (Objects.nonNull(transferContract.getOwnerAddress())) { transactionLogTrigger.setFromAddress(StringUtil - .encode58Check(contractTransfer.getOwnerAddress().toByteArray())); + .encode58Check(transferContract.getOwnerAddress().toByteArray())); } - if (Objects.nonNull(contractTransfer.getToAddress())) { + if (Objects.nonNull(transferContract.getToAddress())) { transactionLogTrigger.setToAddress( - StringUtil.encode58Check(contractTransfer.getToAddress().toByteArray())); + StringUtil.encode58Check(transferContract.getToAddress().toByteArray())); } - transactionLogTrigger.setAssetAmount(contractTransfer.getAmount()); + transactionLogTrigger.setAssetAmount(transferContract.getAmount()); } break; case TransferAssetContract: - TransferAssetContract contractAssetTransfer = contractParameter + TransferAssetContract transferAssetContract = contractParameter .unpack(TransferAssetContract.class); - if (Objects.nonNull(contractAssetTransfer)) { - if (Objects.nonNull(contractAssetTransfer.getAssetName())) { + if (Objects.nonNull(transferAssetContract)) { + if (Objects.nonNull(transferAssetContract.getAssetName())) { transactionLogTrigger - .setAssetName(contractAssetTransfer.getAssetName().toStringUtf8()); + .setAssetName(transferAssetContract.getAssetName().toStringUtf8()); } - if (Objects.nonNull(contractAssetTransfer.getOwnerAddress())) { + if (Objects.nonNull(transferAssetContract.getOwnerAddress())) { transactionLogTrigger.setFromAddress( StringUtil - .encode58Check(contractAssetTransfer.getOwnerAddress().toByteArray())); + .encode58Check(transferAssetContract.getOwnerAddress().toByteArray())); } - if (Objects.nonNull(contractAssetTransfer.getToAddress())) { + if (Objects.nonNull(transferAssetContract.getToAddress())) { transactionLogTrigger.setToAddress(StringUtil - .encode58Check(contractAssetTransfer.getToAddress().toByteArray())); + .encode58Check(transferAssetContract.getToAddress().toByteArray())); } - transactionLogTrigger.setAssetAmount(contractAssetTransfer.getAmount()); + transactionLogTrigger.setAssetAmount(transferAssetContract.getAmount()); } break; case TriggerSmartContract: @@ -234,7 +234,6 @@ public TransactionLogTriggerCapsule(TransactionCapsule trxCapsule, BlockCapsule logPojoList.add(logPojo); } - transactionLogTrigger.setLogList(logPojoList); } } diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index b08f8eb74ef..e00cbccbcab 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -3893,7 +3893,7 @@ public String getEnergyPrices() { logger.error("getEnergyPrices failed, error is {}", e.getMessage()); } - return ""; + return null; } public String getCoinbase() { From 99d06662f2b6b2636c822a6868642c6aa2abc576 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 22 Sep 2021 18:08:40 +0800 Subject: [PATCH 298/341] feat: set timestamp to solidity --- .../logsfilter/capsule/SolidityTriggerCapsule.java | 4 ++++ framework/src/main/java/org/tron/core/db/Manager.java | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/framework/src/main/java/org/tron/common/logsfilter/capsule/SolidityTriggerCapsule.java b/framework/src/main/java/org/tron/common/logsfilter/capsule/SolidityTriggerCapsule.java index c4ab8db0d1c..2da7f1f4973 100644 --- a/framework/src/main/java/org/tron/common/logsfilter/capsule/SolidityTriggerCapsule.java +++ b/framework/src/main/java/org/tron/common/logsfilter/capsule/SolidityTriggerCapsule.java @@ -16,6 +16,10 @@ public SolidityTriggerCapsule(long latestSolidifiedBlockNum) { solidityTrigger.setLatestSolidifiedBlockNumber(latestSolidifiedBlockNum); } + public void setTimeStamp(long timeStamp) { + solidityTrigger.setTimeStamp(timeStamp); + } + @Override public void processTrigger() { EventPluginLoader.getInstance().postSolidityTrigger(solidityTrigger); diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index eba6dc7d04d..c8fdb5a9b3e 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -1710,6 +1710,16 @@ private void postSolidityTrigger(final long latestSolidifiedBlockNumber) { if (eventPluginLoaded && EventPluginLoader.getInstance().isSolidityTriggerEnable()) { SolidityTriggerCapsule solidityTriggerCapsule = new SolidityTriggerCapsule(latestSolidifiedBlockNumber); + + BlockCapsule blockCapsule; + try { + blockCapsule = chainBaseManager.getBlockByNum(latestSolidifiedBlockNumber); + solidityTriggerCapsule.setTimeStamp(blockCapsule.getTimeStamp()); + } catch (Exception e) { + logger.error("postSolidityTrigger getBlockByNum={} except, {}", + latestSolidifiedBlockNumber, e.getMessage()); + } + boolean result = triggerCapsuleQueue.offer(solidityTriggerCapsule); if (!result) { logger.info("too many trigger, lost solidified trigger, " From a71801f5534aac1e18992a27d637656f2f0f8fab Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 22 Sep 2021 18:13:54 +0800 Subject: [PATCH 299/341] feat: update 32603 to 32000 for jsonrpc --- .../java/org/tron/core/services/jsonrpc/TronJsonRpc.java | 5 ++--- .../java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index cb3a759d683..6bae375d949 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -5,7 +5,6 @@ import com.googlecode.jsonrpc4j.JsonRpcError; import com.googlecode.jsonrpc4j.JsonRpcErrors; import com.googlecode.jsonrpc4j.JsonRpcMethod; -import java.util.Arrays; import java.util.List; import lombok.AllArgsConstructor; import lombok.ToString; @@ -182,7 +181,7 @@ String getABIOfSmartContract(String contractAddress, String bnOrId) @JsonRpcErrors({ @JsonRpcError(exception = JsonRpcInvalidRequestException.class, code = -32600, data = "{}"), @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), - @JsonRpcError(exception = JsonRpcInternalException.class, code = -32603, data = "{}"), + @JsonRpcError(exception = JsonRpcInternalException.class, code = -32000, data = "{}"), }) String estimateGas(CallArguments args) throws JsonRpcInvalidRequestException, JsonRpcInvalidParamsException, JsonRpcInternalException; @@ -254,7 +253,7 @@ String getCall(CallArguments transactionCall, String blockNumOrTag) @JsonRpcErrors({ @JsonRpcError(exception = JsonRpcInvalidRequestException.class, code = -32600, data = "{}"), @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), - @JsonRpcError(exception = JsonRpcInternalException.class, code = -32603, data = "{}"), + @JsonRpcError(exception = JsonRpcInternalException.class, code = -32000, data = "{}"), }) TransactionJson buildTransaction(BuildArguments args) throws JsonRpcInvalidParamsException, JsonRpcInvalidRequestException, diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 05f6a3ab216..a561e5d5576 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -491,7 +491,7 @@ public String estimateGas(CallArguments args) throws JsonRpcInvalidRequestExcept errString = e.getMessage().replaceAll("[\"]", "\'"); } - throw new JsonRpcInvalidRequestException(errString); + throw new JsonRpcInternalException(errString); } } From b48a14a9dc8ea38c36e0e9e64fe1d0617cc8fdde Mon Sep 17 00:00:00 2001 From: sophiawang <1975054324@qq.com> Date: Thu, 23 Sep 2021 11:47:28 +0800 Subject: [PATCH 300/341] fix multisign error message --- .../tron/wallet/dailybuild/multisign/MultiSign31.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/multisign/MultiSign31.java b/framework/src/test/java/stest/tron/wallet/dailybuild/multisign/MultiSign31.java index 468cba915cc..7aa7403c631 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/multisign/MultiSign31.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/multisign/MultiSign31.java @@ -255,8 +255,8 @@ public void testMultiUpdatepermissions_35() { Assert .assertThat(returnResult1.getCode().toString(), containsString("SIGERROR")); Assert - .assertThat(returnResult1.getMessage().toStringUtf8(), - containsString("validate signature error Permission denied")); + .assertThat(returnResult1.getMessage().toStringUtf8().toLowerCase(), + containsString("validate signature error: permission denied".toLowerCase())); Transaction transaction2 = PublicMethed .addTransactionSign(transaction1, sendAccountKey3, blockingStubFull); TransactionSignWeight transactionSignWeight1 = PublicMethedForMutiSign @@ -275,7 +275,7 @@ public void testMultiUpdatepermissions_35() { .broadcastTransaction1(transaction2, blockingStubFull); logger.info("returnResult2:" + returnResult2); Assert - .assertThat(returnResult2.getCode().toString(), containsString("DUP_TRANSACTION_ERROR")); + .assertThat(returnResult2.getCode().toString(), containsString("SIGERROR")); Account test001AddressAccount3 = PublicMethed.queryAccount(test001Address, blockingStubFull); long balance3 = test001AddressAccount3.getBalance(); logger.info("balance3:" + balance3); @@ -466,7 +466,7 @@ public void testMultiUpdatepermissions_37() { .broadcastTransaction1(transaction2, blockingStubFull); logger.info("returnResult2:" + returnResult2); Assert - .assertThat(returnResult2.getCode().toString(), containsString("DUP_TRANSACTION_ERROR")); + .assertThat(returnResult2.getCode().toString(), containsString("SIGERROR")); Account test001AddressAccount3 = PublicMethed.queryAccount(test001Address, blockingStubFull); long balance3 = test001AddressAccount3.getBalance(); Assert.assertEquals(balance2, balance3); @@ -558,7 +558,7 @@ public void testMultiUpdatepermissions_38() { .broadcastTransaction1(transaction2, blockingStubFull); logger.info("returnResult2:" + returnResult2); Assert - .assertThat(returnResult2.getCode().toString(), containsString("DUP_TRANSACTION_ERROR")); + .assertThat(returnResult2.getCode().toString(), containsString("SIGERROR")); Account test001AddressAccount3 = PublicMethed.queryAccount(test001Address, blockingStubFull); long balance3 = test001AddressAccount3.getBalance(); Assert.assertEquals(balance3, balance2); From 1fc4632f690aa041dc3f5250112e07617aaabdc9 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 23 Sep 2021 12:00:14 +0800 Subject: [PATCH 301/341] feat: remove db after test --- .../vm/ValidateMultiSignContractTest.java | 17 +++++++++++++++++ .../leveldb/RocksDbDataSourceImplTest.java | 12 ++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/framework/src/test/java/org/tron/common/runtime/vm/ValidateMultiSignContractTest.java b/framework/src/test/java/org/tron/common/runtime/vm/ValidateMultiSignContractTest.java index 883e65a99cc..4ce516cd11f 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/ValidateMultiSignContractTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/ValidateMultiSignContractTest.java @@ -1,12 +1,14 @@ package org.tron.common.runtime.vm; import com.google.protobuf.ByteString; +import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.tuple.Pair; import org.bouncycastle.util.encoders.Hex; +import org.junit.AfterClass; import org.junit.Test; import org.testng.Assert; import org.tron.common.application.Application; @@ -17,6 +19,7 @@ import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.ByteArray; import org.tron.common.utils.ByteUtil; +import org.tron.common.utils.FileUtil; import org.tron.common.utils.Sha256Hash; import org.tron.common.utils.StringUtil; import org.tron.core.Constant; @@ -55,6 +58,20 @@ public class ValidateMultiSignContractTest { ValidateMultiSign contract = new ValidateMultiSign(); + /** + * Release resources. + */ + @AfterClass + public static void destroy() { + Args.clearParam(); + context.destroy(); + if (FileUtil.deleteDir(new File(dbPath))) { + logger.info("Release resources successful."); + } else { + logger.info("Release resources failure."); + } + } + @Test public void testAddressNonExist() { byte[] hash = Hash.sha3(longData); diff --git a/framework/src/test/java/org/tron/common/storage/leveldb/RocksDbDataSourceImplTest.java b/framework/src/test/java/org/tron/common/storage/leveldb/RocksDbDataSourceImplTest.java index ef27e6e6e66..93d3451e7a1 100644 --- a/framework/src/test/java/org/tron/common/storage/leveldb/RocksDbDataSourceImplTest.java +++ b/framework/src/test/java/org/tron/common/storage/leveldb/RocksDbDataSourceImplTest.java @@ -18,6 +18,7 @@ import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; import org.tron.common.storage.rocksdb.RocksDbDataSourceImpl; import org.tron.common.utils.ByteArray; @@ -49,16 +50,23 @@ public class RocksDbDataSourceImplTest { */ @AfterClass public static void destroy() { + String directory =Args.getInstance().getStorage().getDbDirectory(); Args.clearParam(); if (FileUtil.deleteDir(new File(dbPath))) { logger.info("Release resources successful."); } else { logger.info("Release resources failure."); } + + if (FileUtil.deleteDir(new File(dbPath + directory))) { + logger.info("Release resources successful."); + } else { + logger.info("Release resources failure."); + } } - @Before - public void initDb() { + @BeforeClass + public static void initDb() { Args.setParam(new String[]{"--output-directory", dbPath}, "config-test-dbbackup.conf"); dataSourceTest = new RocksDbDataSourceImpl(dbPath + File.separator, "test_rocksDb"); } From c12349c7aff4d2b1b77e324c258defdf97f9a5e0 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 23 Sep 2021 12:14:55 +0800 Subject: [PATCH 302/341] typo --- .../tron/common/storage/leveldb/RocksDbDataSourceImplTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/test/java/org/tron/common/storage/leveldb/RocksDbDataSourceImplTest.java b/framework/src/test/java/org/tron/common/storage/leveldb/RocksDbDataSourceImplTest.java index 93d3451e7a1..e872b4ddfab 100644 --- a/framework/src/test/java/org/tron/common/storage/leveldb/RocksDbDataSourceImplTest.java +++ b/framework/src/test/java/org/tron/common/storage/leveldb/RocksDbDataSourceImplTest.java @@ -50,7 +50,7 @@ public class RocksDbDataSourceImplTest { */ @AfterClass public static void destroy() { - String directory =Args.getInstance().getStorage().getDbDirectory(); + String directory = Args.getInstance().getStorage().getDbDirectory(); Args.clearParam(); if (FileUtil.deleteDir(new File(dbPath))) { logger.info("Release resources successful."); From aa950df53a6381128255dca07430d7dff5261640 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 23 Sep 2021 12:25:10 +0800 Subject: [PATCH 303/341] feat: remove db for EnergyPriceHistoryLoaderTest --- .../core/services/ProposalServiceTest.java | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java b/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java index 4e5d420535c..11c29f59958 100644 --- a/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java +++ b/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java @@ -6,9 +6,12 @@ import java.io.File; import java.util.HashSet; import java.util.Set; +import lombok.extern.slf4j.Slf4j; import org.junit.After; +import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; import org.tron.common.application.TronApplicationContext; import org.tron.common.utils.FileUtil; @@ -21,14 +24,15 @@ import org.tron.core.utils.ProposalUtil.ProposalType; import org.tron.protos.Protocol.Proposal; +@Slf4j public class ProposalServiceTest { - private TronApplicationContext context; - private Manager manager; - private String dbPath = "output_proposal_test"; + private static TronApplicationContext context; + private static Manager manager; + private static String dbPath = "output_proposal_test"; - @Before - public void init() { + @BeforeClass + public static void init() { Args.setParam(new String[]{"-d", dbPath}, Constant.TEST_CONF); context = new TronApplicationContext(DefaultConfig.class); manager = context.getBean(Manager.class); @@ -82,11 +86,14 @@ public void testUpdateEnergyFee() { currentHistory); } - - @After - public void removeDb() { + @AfterClass + public static void removeDb() { Args.clearParam(); context.destroy(); - FileUtil.deleteDir(new File(dbPath)); + if (FileUtil.deleteDir(new File(dbPath))) { + logger.info("Release resources successful."); + } else { + logger.info("Release resources failure."); + } } } From e0c0933e2b27f611ede39ce946875f85f6b0c914 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 23 Sep 2021 12:26:39 +0800 Subject: [PATCH 304/341] typo --- .../test/java/org/tron/core/services/ProposalServiceTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java b/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java index 11c29f59958..8c28c04c05d 100644 --- a/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java +++ b/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java @@ -7,10 +7,8 @@ import java.util.HashSet; import java.util.Set; import lombok.extern.slf4j.Slf4j; -import org.junit.After; import org.junit.AfterClass; import org.junit.Assert; -import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.tron.common.application.TronApplicationContext; From 15a70585f2db15a1e4836575e7d533d5a2c42cc3 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Fri, 24 Sep 2021 11:32:39 +0800 Subject: [PATCH 305/341] remove the hidden danger of blockid --- framework/src/main/java/org/tron/core/db/Manager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index c8fdb5a9b3e..a079b08b638 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -1325,7 +1325,7 @@ public synchronized BlockCapsule generateBlock(Miner miner, long blockTime, long blockCapsule.setMerkleRoot(); blockCapsule.sign(miner.getPrivateKey()); - return blockCapsule; + return new BlockCapsule(blockCapsule.getInstance()); } From 721f19c5fd48942a706e5f0fac2a7afe5b292be7 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Fri, 24 Sep 2021 14:24:48 +0800 Subject: [PATCH 306/341] set generatedByMyself to true --- framework/src/main/java/org/tron/core/db/Manager.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index a079b08b638..ceab3ef9f0b 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -1325,8 +1325,9 @@ public synchronized BlockCapsule generateBlock(Miner miner, long blockTime, long blockCapsule.setMerkleRoot(); blockCapsule.sign(miner.getPrivateKey()); - return new BlockCapsule(blockCapsule.getInstance()); - + BlockCapsule capsule = new BlockCapsule(blockCapsule.getInstance()); + capsule.generatedByMyself = true; + return capsule; } private void filterOwnerAddress(TransactionCapsule transactionCapsule, Set result) { From ed2c62dde44058ef6c2c60e5458395e809eb68cd Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Fri, 24 Sep 2021 16:35:37 +0800 Subject: [PATCH 307/341] fix: set blockNum before postTransactionTrigger, reset block before process transaction trigger, only trigger transaction when process block --- .../org/tron/core/capsule/BlockCapsule.java | 4 ++++ .../tron/core/capsule/TransactionCapsule.java | 3 --- .../src/main/java/org/tron/core/db/Manager.java | 17 +++++++++++++---- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/chainbase/src/main/java/org/tron/core/capsule/BlockCapsule.java b/chainbase/src/main/java/org/tron/core/capsule/BlockCapsule.java index 54bdbe9e5b0..df498c43407 100755 --- a/chainbase/src/main/java/org/tron/core/capsule/BlockCapsule.java +++ b/chainbase/src/main/java/org/tron/core/capsule/BlockCapsule.java @@ -260,6 +260,10 @@ public ByteString getWitnessAddress() { return this.block.getBlockHeader().getRawData().getWitnessAddress(); } + public boolean isMerkleRootEmpty() { + return this.block.getBlockHeader().getRawData().getTxTrieRoot().toByteArray().length == 0; + } + @Override public byte[] getData() { return this.block.toByteArray(); diff --git a/chainbase/src/main/java/org/tron/core/capsule/TransactionCapsule.java b/chainbase/src/main/java/org/tron/core/capsule/TransactionCapsule.java index a97e70e63a7..cd35bf4a253 100755 --- a/chainbase/src/main/java/org/tron/core/capsule/TransactionCapsule.java +++ b/chainbase/src/main/java/org/tron/core/capsule/TransactionCapsule.java @@ -535,8 +535,6 @@ private Sha256Hash getRawHash() { public void sign(byte[] privateKey) { SignInterface cryptoEngine = SignUtils .fromPrivate(privateKey, CommonParameter.getInstance().isECKeyCryptoEngine()); - // String signature = cryptoEngine.signHash(getRawHash().getBytes()); - // ByteString sig = ByteString.copyFrom(signature.getBytes()); ByteString sig = ByteString.copyFrom(cryptoEngine.Base64toBytes(cryptoEngine .signHash(getRawHash().getBytes()))); this.transaction = this.transaction.toBuilder().addSignature(sig).build(); @@ -574,7 +572,6 @@ public void addSign(byte[] privateKey, AccountStore accountStore) ByteArray.toHexString(privateKey) + "'s address is " + encode58Check(address) + " but it is not contained of permission."); } - // String signature = cryptoEngine.signHash(getRawHash().getBytes()); ByteString sig = ByteString.copyFrom(cryptoEngine.Base64toBytes(cryptoEngine .signHash(getRawHash().getBytes()))); this.transaction = this.transaction.toBuilder().addSignature(sig).build(); diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index c8fdb5a9b3e..89e6f185664 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -1191,11 +1191,11 @@ public TransactionInfo processTransaction(final TransactionCapsule trxCap, Block .buildTransactionInfoInstance(trxCap, blockCap, trace); // if event subscribe is enabled, post contract triggers to queue - String blockHash = ""; - if (Objects.nonNull(blockCap)) { - blockHash = blockCap.getBlockId().toString(); + // only trigger when process block + if (Objects.nonNull(blockCap) && blockCap.isMerkleRootEmpty()) { + String blockHash = blockCap.getBlockId().toString(); + postContractTrigger(trace, false, blockHash); } - postContractTrigger(trace, false, blockHash); Contract contract = trxCap.getInstance().getRawData().getContract(0); if (isMultiSignTransaction(trxCap.getInstance())) { @@ -1509,6 +1509,9 @@ private void postSolidityLogContractTrigger(Long blockNum, Long lastSolidityNum) .getTransactionId()))) { triggerCapsule.setTriggerName(Trigger.SOLIDITYLOG_TRIGGER_NAME); EventPluginLoader.getInstance().postSolidityLogTrigger(triggerCapsule); + } else { + logger.error("postSolidityLogContractTrigger txId={} not contains transaction", + triggerCapsule.getTransactionId()); } } Args.getSolidityContractLogTriggerMap().remove(blockNum); @@ -1731,6 +1734,7 @@ private void postSolidityTrigger(final long latestSolidifiedBlockNumber) { private void postBlockTrigger(final BlockCapsule blockCapsule) { BlockCapsule newBlock = blockCapsule; + // process block trigger if (eventPluginLoaded && EventPluginLoader.getInstance().isBlockLogTriggerEnable()) { if (EventPluginLoader.getInstance().isBlockLogTriggerSolidified()) { long solidityBlkNum = getDynamicPropertiesStore().getLatestSolidifiedBlockNum(); @@ -1751,6 +1755,7 @@ private void postBlockTrigger(final BlockCapsule blockCapsule) { } } + // process transaction trigger if (eventPluginLoaded && EventPluginLoader.getInstance().isTransactionLogTriggerEnable()) { if (EventPluginLoader.getInstance().isTransactionLogTriggerSolidified()) { long solidityBlkNum = getDynamicPropertiesStore().getLatestSolidifiedBlockNum(); @@ -1761,6 +1766,9 @@ private void postBlockTrigger(final BlockCapsule blockCapsule) { logger.error("postBlockTrigger getBlockByNum blkNum={} except, error is {}", solidityBlkNum, e.getMessage()); } + } else { + // need to reset block + newBlock = blockCapsule; } List transactionCapsuleList = newBlock.getTransactions(); @@ -1794,6 +1802,7 @@ private void postBlockTrigger(final BlockCapsule blockCapsule) { for (int i = 0; i < transactionCapsuleList.size(); i++) { TransactionInfo transactionInfo = transactionInfoList.getTransactionInfo(i); TransactionCapsule transactionCapsule = transactionCapsuleList.get(i); + transactionCapsule.setBlockNum(newBlock.getNum()); cumulativeEnergyUsed += postTransactionTrigger(transactionCapsule, newBlock, i, cumulativeEnergyUsed, cumulativeLogCount, transactionInfo, energyUnitPrice); From 97aaaf23f56915dc66675896354350c05dcc9232 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Fri, 24 Sep 2021 16:42:13 +0800 Subject: [PATCH 308/341] typo --- framework/src/main/java/org/tron/core/db/Manager.java | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 89e6f185664..4e1f47e0143 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -1802,6 +1802,7 @@ private void postBlockTrigger(final BlockCapsule blockCapsule) { for (int i = 0; i < transactionCapsuleList.size(); i++) { TransactionInfo transactionInfo = transactionInfoList.getTransactionInfo(i); TransactionCapsule transactionCapsule = transactionCapsuleList.get(i); + // reset block num to ignore value is -1 transactionCapsule.setBlockNum(newBlock.getNum()); cumulativeEnergyUsed += postTransactionTrigger(transactionCapsule, newBlock, i, From 458120c04c9391e193066581e91a80c124141c5a Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Fri, 24 Sep 2021 16:54:02 +0800 Subject: [PATCH 309/341] typo --- framework/src/main/java/org/tron/core/db/Manager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 81f49defc5f..ec27696488a 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -1192,7 +1192,7 @@ public TransactionInfo processTransaction(final TransactionCapsule trxCap, Block // if event subscribe is enabled, post contract triggers to queue // only trigger when process block - if (Objects.nonNull(blockCap) && blockCap.isMerkleRootEmpty()) { + if (Objects.nonNull(blockCap) && !blockCap.isMerkleRootEmpty()) { String blockHash = blockCap.getBlockId().toString(); postContractTrigger(trace, false, blockHash); } From 4578e483e7879207cc387f9827f2e08c00535da4 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Fri, 24 Sep 2021 17:27:39 +0800 Subject: [PATCH 310/341] feat: add some logs --- .../capsule/ContractTriggerCapsule.java | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/framework/src/main/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsule.java b/framework/src/main/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsule.java index 3c83ae9f33d..60e15d91d5d 100644 --- a/framework/src/main/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsule.java +++ b/framework/src/main/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsule.java @@ -136,9 +136,14 @@ public void processTrigger() { } if (EventPluginLoader.getInstance().isSolidityEventTriggerEnable()) { - Args.getSolidityContractEventTriggerMap().computeIfAbsent(event + boolean result = Args.getSolidityContractEventTriggerMap().computeIfAbsent(event .getBlockNumber(), listBlk -> new LinkedBlockingQueue()) .offer((ContractEventTrigger) event); + + if (!result) { + logger.info("too many triggers, solidity event trigger lost: {}", + event.getUniqueId()); + } } // enable process contractEvent as contractLog @@ -155,9 +160,14 @@ public void processTrigger() { } if (EventPluginLoader.getInstance().isSolidityLogTriggerRedundancy()) { - Args.getSolidityContractLogTriggerMap().computeIfAbsent(event + boolean result = Args.getSolidityContractLogTriggerMap().computeIfAbsent(event .getBlockNumber(), listBlk -> new LinkedBlockingQueue()) .offer(logTrigger); + + if (!result) { + logger.info("too many triggers, solidity log trigger lost: {}", + logTrigger.getUniqueId()); + } } } } else { @@ -166,9 +176,14 @@ public void processTrigger() { } if (EventPluginLoader.getInstance().isSolidityLogTriggerEnable()) { - Args.getSolidityContractLogTriggerMap().computeIfAbsent(event + boolean result = Args.getSolidityContractLogTriggerMap().computeIfAbsent(event .getBlockNumber(), listBlk -> new LinkedBlockingQueue()) .offer((ContractLogTrigger) event); + + if (!result) { + logger.info("too many triggers, solidity log trigger lost: {}", + event.getUniqueId()); + } } } } From 92daff61b1b68d668cd96e5ad5abab98af750950 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Tue, 28 Sep 2021 14:21:30 +0800 Subject: [PATCH 311/341] optimize the processing of expired transactions in the repush queue --- .../java/org/tron/core/db/PendingManager.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/framework/src/main/java/org/tron/core/db/PendingManager.java b/framework/src/main/java/org/tron/core/db/PendingManager.java index e7ef3ec077e..9908d1d7550 100644 --- a/framework/src/main/java/org/tron/core/db/PendingManager.java +++ b/framework/src/main/java/org/tron/core/db/PendingManager.java @@ -4,6 +4,9 @@ import org.tron.core.capsule.TransactionCapsule; import org.tron.core.config.args.Args; +import java.util.ArrayList; +import java.util.List; + @Slf4j(topic = "DB") public class PendingManager implements AutoCloseable { @@ -19,9 +22,21 @@ public PendingManager(Manager db) { @Override public void close() { + List list = new ArrayList<>(); + TransactionCapsule capsule = dbManager.getRePushTransactions().poll(); + while (capsule != null) { + list.add(capsule); + capsule = dbManager.getRePushTransactions().poll(); + } + + for (TransactionCapsule tx : list) { + dbManager.getRePushTransactions().add(tx); + } + for (TransactionCapsule tx : dbManager.getPendingTransactions()) { txIteration(tx); } + dbManager.getPendingTransactions().clear(); for (TransactionCapsule tx : dbManager.getPoppedTransactions()) { tx.setTime(System.currentTimeMillis()); From e7d9f288ffe2eb8a08adf8b635a8471c90248e16 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Tue, 28 Sep 2021 14:24:48 +0800 Subject: [PATCH 312/341] add expired logic --- framework/src/main/java/org/tron/core/db/PendingManager.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/db/PendingManager.java b/framework/src/main/java/org/tron/core/db/PendingManager.java index 9908d1d7550..4f9f8505eb7 100644 --- a/framework/src/main/java/org/tron/core/db/PendingManager.java +++ b/framework/src/main/java/org/tron/core/db/PendingManager.java @@ -25,7 +25,9 @@ public void close() { List list = new ArrayList<>(); TransactionCapsule capsule = dbManager.getRePushTransactions().poll(); while (capsule != null) { - list.add(capsule); + if (System.currentTimeMillis() - capsule.getTime() < timeout) { + list.add(capsule); + } capsule = dbManager.getRePushTransactions().poll(); } From 4c744f821a20ec11707c8e23f8b44cdaee4120a1 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Tue, 28 Sep 2021 14:28:30 +0800 Subject: [PATCH 313/341] opt queue add logic --- framework/src/main/java/org/tron/core/db/PendingManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/PendingManager.java b/framework/src/main/java/org/tron/core/db/PendingManager.java index 4f9f8505eb7..6a23255726e 100644 --- a/framework/src/main/java/org/tron/core/db/PendingManager.java +++ b/framework/src/main/java/org/tron/core/db/PendingManager.java @@ -31,8 +31,8 @@ public void close() { capsule = dbManager.getRePushTransactions().poll(); } - for (TransactionCapsule tx : list) { - dbManager.getRePushTransactions().add(tx); + if (list.size() > 0) { + dbManager.getRePushTransactions().addAll(list); } for (TransactionCapsule tx : dbManager.getPendingTransactions()) { From f9d9b45cedec3abc22b517c1b3e901b484fb67fc Mon Sep 17 00:00:00 2001 From: wubin01 Date: Tue, 28 Sep 2021 14:37:11 +0800 Subject: [PATCH 314/341] opt queue add logic --- .../main/java/org/tron/core/db/PendingManager.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/PendingManager.java b/framework/src/main/java/org/tron/core/db/PendingManager.java index 6a23255726e..3a3d4580d44 100644 --- a/framework/src/main/java/org/tron/core/db/PendingManager.java +++ b/framework/src/main/java/org/tron/core/db/PendingManager.java @@ -23,17 +23,14 @@ public PendingManager(Manager db) { public void close() { List list = new ArrayList<>(); - TransactionCapsule capsule = dbManager.getRePushTransactions().poll(); - while (capsule != null) { + dbManager.getRePushTransactions().forEach(capsule -> { if (System.currentTimeMillis() - capsule.getTime() < timeout) { list.add(capsule); } - capsule = dbManager.getRePushTransactions().poll(); - } + }); - if (list.size() > 0) { - dbManager.getRePushTransactions().addAll(list); - } + dbManager.getRePushTransactions().clear(); + dbManager.getRePushTransactions().addAll(list); for (TransactionCapsule tx : dbManager.getPendingTransactions()) { txIteration(tx); From 99563aee002fde21e079a988efd4b959853173f3 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Tue, 28 Sep 2021 15:48:33 +0800 Subject: [PATCH 315/341] solve checkstyle problem --- framework/src/main/java/org/tron/core/db/PendingManager.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/PendingManager.java b/framework/src/main/java/org/tron/core/db/PendingManager.java index 3a3d4580d44..b9adebe74ba 100644 --- a/framework/src/main/java/org/tron/core/db/PendingManager.java +++ b/framework/src/main/java/org/tron/core/db/PendingManager.java @@ -1,12 +1,11 @@ package org.tron.core.db; +import java.util.ArrayList; +import java.util.List; import lombok.extern.slf4j.Slf4j; import org.tron.core.capsule.TransactionCapsule; import org.tron.core.config.args.Args; -import java.util.ArrayList; -import java.util.List; - @Slf4j(topic = "DB") public class PendingManager implements AutoCloseable { From 5abc309f4ed9e5168aa6cee5e671b8afbf7efdd1 Mon Sep 17 00:00:00 2001 From: Asuka Date: Tue, 28 Sep 2021 17:48:31 +0800 Subject: [PATCH 316/341] feat(tvm,jsonrpc): cut chainid to four bytes --- .../src/main/java/org/tron/core/vm/program/Program.java | 7 +++++-- .../org/tron/core/services/jsonrpc/TronJsonRpcImpl.java | 3 ++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/vm/program/Program.java b/actuator/src/main/java/org/tron/core/vm/program/Program.java index 4de24d7cf4d..fc22f708e5f 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/Program.java +++ b/actuator/src/main/java/org/tron/core/vm/program/Program.java @@ -1245,8 +1245,11 @@ public DataWord getCallerAddress() { } public DataWord getChainId() { - return new DataWord(Hex.toHexString(getContractState() - .getBlockByNum(0).getBlockId().getBytes())); + byte[] chainId = getContractState().getBlockByNum(0).getBlockId().getBytes(); + if (VMConfig.allowTvmCompatibleEvm()) { + chainId = Arrays.copyOfRange(chainId, chainId.length - 4, chainId.length); + } + return new DataWord(chainId); } public DataWord getDropPrice() { return new DataWord(1); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index a561e5d5576..31715937eae 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -239,7 +239,8 @@ public String getNetVersion() throws JsonRpcInternalException { public String ethChainId() throws JsonRpcInternalException { // return hash of genesis block try { - return ByteArray.toJsonHex(wallet.getBlockCapsuleByNum(0).getBlockId().getBytes()); + byte[] chainId = wallet.getBlockCapsuleByNum(0).getBlockId().getBytes(); + return ByteArray.toJsonHex(Arrays.copyOfRange(chainId, chainId.length - 4, chainId.length)); } catch (Exception e) { throw new JsonRpcInternalException(e.getMessage()); } From c6e73db80b27addaa6c665dd024a7a9968ad54b3 Mon Sep 17 00:00:00 2001 From: "federico.zhen" Date: Tue, 28 Sep 2021 18:14:38 +0800 Subject: [PATCH 317/341] set the blackhole account permission --- .../org/tron/core/capsule/AccountCapsule.java | 12 ++++----- .../core/store/DynamicPropertiesStore.java | 26 +++++++++++++++++++ .../main/java/org/tron/core/db/Manager.java | 13 ++++++++++ 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java b/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java index 74ac8287d37..0cf5d525521 100644 --- a/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java +++ b/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java @@ -19,10 +19,8 @@ import com.google.common.collect.Maps; import com.google.protobuf.ByteString; import com.google.protobuf.InvalidProtocolBufferException; - import java.util.List; import java.util.Map; - import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; @@ -1117,9 +1115,11 @@ public void updatePermissions(Permission owner, Permission witness, List new IllegalArgumentException("not found ENERGY_PRICE_HISTORY_DONE")); } + public boolean isBlackholeAccountPermissionSet() { + return getSetBlackholeAccountPermission() == 1L; + } + public String getEnergyPriceHistory() { return Optional.ofNullable(getUnchecked(ENERGY_PRICE_HISTORY)) .map(BytesCapsule::getData) @@ -2368,6 +2378,19 @@ public void saveEnergyPriceHistory(String value) { this.put(ENERGY_PRICE_HISTORY, new BytesCapsule(ByteArray.fromString(value))); } + + public long getSetBlackholeAccountPermission() { + return Optional.of(getUnchecked(DynamicResourceProperties.SET_BLACKHOLE_ACCOUNT_PERMISSION)) + .map(BytesCapsule::getData) + .map(ByteArray::toLong) + .orElseThrow(() -> new IllegalArgumentException("not found ALLOW_CLOSE_BLACKHOLE_ACCOUNT")); + } + + public void saveSetBlackholePermission(long value) { + this.put(DynamicResourceProperties.SET_BLACKHOLE_ACCOUNT_PERMISSION, + new BytesCapsule(ByteArray.fromLong(value))); + } + private static class DynamicResourceProperties { private static final byte[] ONE_DAY_NET_LIMIT = "ONE_DAY_NET_LIMIT".getBytes(); @@ -2396,6 +2419,9 @@ private static class DynamicResourceProperties { private static final byte[] ADAPTIVE_RESOURCE_LIMIT_TARGET_RATIO = "ADAPTIVE_RESOURCE_LIMIT_TARGET_RATIO" .getBytes(); + private static final byte[] SET_BLACKHOLE_ACCOUNT_PERMISSION = + "SET_BLACKHOLE_ACCOUNT_PERMISSION" + .getBytes(); } } diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index ec27696488a..95c3f88eca9 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -66,6 +66,7 @@ import org.tron.consensus.base.Param.Miner; import org.tron.core.ChainBaseManager; import org.tron.core.Constant; +import org.tron.core.Wallet; import org.tron.core.actuator.ActuatorCreator; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.BlockBalanceTraceCapsule; @@ -140,6 +141,7 @@ import org.tron.core.store.WitnessStore; import org.tron.core.utils.TransactionRegister; import org.tron.protos.Protocol.AccountType; +import org.tron.protos.Protocol.Permission; import org.tron.protos.Protocol.Transaction; import org.tron.protos.Protocol.Transaction.Contract; import org.tron.protos.Protocol.TransactionInfo; @@ -413,6 +415,17 @@ public void init() { new EnergyPriceHistoryLoader(chainBaseManager).doWork(); } + if (!chainBaseManager.getDynamicPropertiesStore().isBlackholeAccountPermissionSet()) { + AccountCapsule blackholeAccount = getAccountStore().getBlackhole(); + byte[] zeroAddress = new byte[21]; + zeroAddress[0] = Wallet.getAddressPreFixByte(); + Permission owner = AccountCapsule + .createDefaultOwnerPermission(ByteString.copyFrom(zeroAddress)); + blackholeAccount.updatePermissions(owner, null, null); + getAccountStore().put(blackholeAccount.getAddress().toByteArray(), blackholeAccount); + chainBaseManager.getDynamicPropertiesStore().saveSetBlackholePermission(1); + } + //for test only chainBaseManager.getDynamicPropertiesStore().updateDynamicStoreByConfig(); From c8b611a57d48f66006eb3a33ef82256297dee10c Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Tue, 28 Sep 2021 18:40:04 +0800 Subject: [PATCH 318/341] typo --- .../core/store/DynamicPropertiesStore.java | 22 ++++++--------- .../main/java/org/tron/core/db/Manager.java | 28 +++++++++++++------ 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java index d5d53a05f3d..5122e58708d 100644 --- a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java +++ b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java @@ -163,9 +163,12 @@ public class DynamicPropertiesStore extends TronStoreWithRevoking private static final byte[] NEW_REWARD_ALGORITHM_EFFECTIVE_CYCLE = "NEW_REWARD_ALGORITHM_EFFECTIVE_CYCLE".getBytes(); //This value is only allowed to be 1 - private static final byte[] ALLOW_ACCOUNT_ASSET_OPTIMIZATION = "ALLOW_ACCOUNT_ASSET_OPTIMIZATION".getBytes(); + private static final byte[] ALLOW_ACCOUNT_ASSET_OPTIMIZATION = + "ALLOW_ACCOUNT_ASSET_OPTIMIZATION".getBytes(); private static final byte[] ENERGY_PRICE_HISTORY = "ENERGY_PRICE_HISTORY".getBytes(); private static final byte[] ENERGY_PRICE_HISTORY_DONE = "ENERGY_PRICE_HISTORY_DONE".getBytes(); + private static final byte[] SET_BLACKHOLE_ACCOUNT_PERMISSION = + "SET_BLACKHOLE_ACCOUNT_PERMISSION".getBytes(); @Autowired @@ -2363,10 +2366,6 @@ public long getEnergyPriceHistoryDone() { () -> new IllegalArgumentException("not found ENERGY_PRICE_HISTORY_DONE")); } - public boolean isBlackholeAccountPermissionSet() { - return getSetBlackholeAccountPermission() == 1L; - } - public String getEnergyPriceHistory() { return Optional.ofNullable(getUnchecked(ENERGY_PRICE_HISTORY)) .map(BytesCapsule::getData) @@ -2378,17 +2377,16 @@ public void saveEnergyPriceHistory(String value) { this.put(ENERGY_PRICE_HISTORY, new BytesCapsule(ByteArray.fromString(value))); } - public long getSetBlackholeAccountPermission() { - return Optional.of(getUnchecked(DynamicResourceProperties.SET_BLACKHOLE_ACCOUNT_PERMISSION)) + return Optional.of(getUnchecked(SET_BLACKHOLE_ACCOUNT_PERMISSION)) .map(BytesCapsule::getData) .map(ByteArray::toLong) - .orElseThrow(() -> new IllegalArgumentException("not found ALLOW_CLOSE_BLACKHOLE_ACCOUNT")); + .orElseThrow( + () -> new IllegalArgumentException("not found SET_BLACKHOLE_ACCOUNT_PERMISSION")); } public void saveSetBlackholePermission(long value) { - this.put(DynamicResourceProperties.SET_BLACKHOLE_ACCOUNT_PERMISSION, - new BytesCapsule(ByteArray.fromLong(value))); + this.put(SET_BLACKHOLE_ACCOUNT_PERMISSION, new BytesCapsule(ByteArray.fromLong(value))); } private static class DynamicResourceProperties { @@ -2419,9 +2417,7 @@ private static class DynamicResourceProperties { private static final byte[] ADAPTIVE_RESOURCE_LIMIT_TARGET_RATIO = "ADAPTIVE_RESOURCE_LIMIT_TARGET_RATIO" .getBytes(); - private static final byte[] SET_BLACKHOLE_ACCOUNT_PERMISSION = - "SET_BLACKHOLE_ACCOUNT_PERMISSION" - .getBytes(); + } } diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 95c3f88eca9..3baf5568741 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -277,6 +277,23 @@ public boolean needToLoadEnergyPriceHistory() { return getDynamicPropertiesStore().getEnergyPriceHistoryDone() == 0L; } + public boolean needToSetBlackholePermission() { + return getDynamicPropertiesStore().getSetBlackholeAccountPermission() == 0L; + } + + private void resetBlackholeAccountPermission() { + AccountCapsule blackholeAccount = getAccountStore().getBlackhole(); + + byte[] zeroAddress = new byte[21]; + zeroAddress[0] = Wallet.getAddressPreFixByte(); + Permission owner = AccountCapsule + .createDefaultOwnerPermission(ByteString.copyFrom(zeroAddress)); + blackholeAccount.updatePermissions(owner, null, null); + getAccountStore().put(blackholeAccount.getAddress().toByteArray(), blackholeAccount); + + getDynamicPropertiesStore().saveSetBlackholePermission(1); + } + public DynamicPropertiesStore getDynamicPropertiesStore() { return chainBaseManager.getDynamicPropertiesStore(); } @@ -415,15 +432,8 @@ public void init() { new EnergyPriceHistoryLoader(chainBaseManager).doWork(); } - if (!chainBaseManager.getDynamicPropertiesStore().isBlackholeAccountPermissionSet()) { - AccountCapsule blackholeAccount = getAccountStore().getBlackhole(); - byte[] zeroAddress = new byte[21]; - zeroAddress[0] = Wallet.getAddressPreFixByte(); - Permission owner = AccountCapsule - .createDefaultOwnerPermission(ByteString.copyFrom(zeroAddress)); - blackholeAccount.updatePermissions(owner, null, null); - getAccountStore().put(blackholeAccount.getAddress().toByteArray(), blackholeAccount); - chainBaseManager.getDynamicPropertiesStore().saveSetBlackholePermission(1); + if (needToSetBlackholePermission()) { + resetBlackholeAccountPermission(); } //for test only From fb188453d9c09077e39a8ee7c86f670201f1caf3 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Tue, 28 Sep 2021 20:59:43 +0800 Subject: [PATCH 319/341] feat: check if blockhole account exists --- .../main/java/org/tron/core/store/DynamicPropertiesStore.java | 4 ++-- framework/src/main/java/org/tron/core/db/Manager.java | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java index 5122e58708d..907d44a85aa 100644 --- a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java +++ b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java @@ -2353,9 +2353,9 @@ public void setAllowAccountAssetOptimization(long value) { this.put(ALLOW_ACCOUNT_ASSET_OPTIMIZATION, new BytesCapsule(ByteArray.fromLong(value))); } - public void saveEnergyPriceHistoryDone(long num) { + public void saveEnergyPriceHistoryDone(long value) { this.put(ENERGY_PRICE_HISTORY_DONE, - new BytesCapsule(ByteArray.fromLong(num))); + new BytesCapsule(ByteArray.fromLong(value))); } public long getEnergyPriceHistoryDone() { diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 3baf5568741..86f350c654e 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -282,6 +282,10 @@ public boolean needToSetBlackholePermission() { } private void resetBlackholeAccountPermission() { + if (getAccountStore().getBlackholeAddress() == null) { + return; + } + AccountCapsule blackholeAccount = getAccountStore().getBlackhole(); byte[] zeroAddress = new byte[21]; From 73b69624694380675655eca415119affd868144c Mon Sep 17 00:00:00 2001 From: Asuka Date: Wed, 29 Sep 2021 13:23:33 +0800 Subject: [PATCH 320/341] test(tvm): add new CHAINID test --- .../runtime/vm/AllowTvmCompatibleEvmTest.java | 77 +++++++++++++------ 1 file changed, 55 insertions(+), 22 deletions(-) diff --git a/framework/src/test/java/org/tron/common/runtime/vm/AllowTvmCompatibleEvmTest.java b/framework/src/test/java/org/tron/common/runtime/vm/AllowTvmCompatibleEvmTest.java index cba9ef7d7a5..4788a0529d8 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/AllowTvmCompatibleEvmTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/AllowTvmCompatibleEvmTest.java @@ -6,6 +6,8 @@ import java.util.Collections; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; +import org.junit.AfterClass; +import org.junit.BeforeClass; import org.junit.Test; import org.testng.Assert; import org.tron.common.runtime.TVMTestResult; @@ -35,9 +37,8 @@ function getRipemd160() public view returns(bytes32 output) { } }*/ - @Test - public void testEthRipemd160() throws ContractExeException, ReceiptCheckErrException, - VMIllegalException, ContractValidateException { + @BeforeClass + public static void beforeClass() { ConfigLoader.disable = true; VMConfig.initAllowTvmTransferTrc10(1); VMConfig.initAllowTvmConstantinople(1); @@ -45,8 +46,11 @@ public void testEthRipemd160() throws ContractExeException, ReceiptCheckErrExcep VMConfig.initAllowTvmIstanbul(1); VMConfig.initAllowTvmLondon(1); VMConfig.initAllowTvmCompatibleEvm(1); - manager.getDynamicPropertiesStore().saveChangeDelegation(1); + } + @Test + public void testEthRipemd160() throws ContractExeException, ReceiptCheckErrException, + VMIllegalException, ContractValidateException { String contractName = "testEthRipemd160"; byte[] address = Hex.decode(OWNER_ADDRESS); String abi = "[{\"inputs\":[],\"name\":\"getRipemd160\"," @@ -133,15 +137,6 @@ function callF() public view returns (bytes32[2] memory) { @Test public void testBlake2f() throws ContractExeException, ReceiptCheckErrException, VMIllegalException, ContractValidateException { - ConfigLoader.disable = true; - VMConfig.initAllowTvmTransferTrc10(1); - VMConfig.initAllowTvmConstantinople(1); - VMConfig.initAllowTvmSolidity059(1); - VMConfig.initAllowTvmIstanbul(1); - VMConfig.initAllowTvmLondon(1); - VMConfig.initAllowTvmCompatibleEvm(1); - manager.getDynamicPropertiesStore().saveChangeDelegation(1); - String contractName = "testBlake2f"; byte[] address = Hex.decode(OWNER_ADDRESS); String abi = "[{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"rounds\"," @@ -230,15 +225,6 @@ function getprice() public view returns(uint) { @Test public void testGasPrice() throws ContractExeException, ReceiptCheckErrException, VMIllegalException, ContractValidateException { - ConfigLoader.disable = true; - VMConfig.initAllowTvmTransferTrc10(1); - VMConfig.initAllowTvmConstantinople(1); - VMConfig.initAllowTvmSolidity059(1); - VMConfig.initAllowTvmIstanbul(1); - VMConfig.initAllowTvmLondon(1); - VMConfig.initAllowTvmCompatibleEvm(1); - manager.getDynamicPropertiesStore().saveChangeDelegation(1); - String contractName = "testGasPrice"; byte[] address = Hex.decode(OWNER_ADDRESS); String abi = "[{\"inputs\":[],\"name\":\"getprice\"," @@ -275,4 +261,51 @@ public void testGasPrice() throws ContractExeException, ReceiptCheckErrException longTo32Bytes(manager.getDynamicPropertiesStore().getEnergyFee())); } + @Test + public void testChainId() throws ContractExeException, ReceiptCheckErrException, + VMIllegalException, ContractValidateException { + String contractName = "TestChainId"; + byte[] address = Hex.decode(OWNER_ADDRESS); + String contractCode = "608060405234801561001057600080fd5b5060b58061001f6000" + + "396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c" + + "80633408e47014602d575b600080fd5b60336047565b604051603e9190605c565b6040" + + "5180910390f35b600046905090565b6056816075565b82525050565b60006020820190" + + "50606f6000830184604f565b92915050565b600081905091905056fea2646970667358" + + "2212203ccbe28f012f703b4369308e34d6dfc1a89a5f51e3ea42d531fcf3a2dba31150" + + "64736f6c63430008070033"; + long feeLimit = 100_000_000L; + + // deploy contract + Protocol.Transaction trx = TvmTestUtils.generateDeploySmartContractAndGetTransaction( + contractName, address, "[]", contractCode, 0, feeLimit, 0, null); + byte[] factoryAddress = WalletUtil.generateContractAddress(trx); + runtime = TvmTestUtils.processTransactionAndReturnRuntime(trx, rootDeposit, null); + Assert.assertNull(runtime.getRuntimeError()); + + // Trigger contract method: getChainId() + String methodSignature = "getChainId()"; + String hexInput = + AbiUtil.parseMethod(methodSignature, Collections.singletonList("")); + + TVMTestResult result = TvmTestUtils + .triggerContractAndReturnTvmTestResult(Hex.decode(OWNER_ADDRESS), + factoryAddress, Hex.decode(hexInput), 0, feeLimit, manager, null); + byte[] returnValue = result.getRuntime().getResult().getHReturn(); + Assert.assertNull(result.getRuntime().getRuntimeError()); + Assert.assertEquals(Hex.toHexString(returnValue), + "0000000000000000000000000000000000000000000000000000000028c12d1e"); + + VMConfig.initAllowTvmCompatibleEvm(0); + } + + @AfterClass + public static void afterClass() { + ConfigLoader.disable = false; + VMConfig.initAllowTvmTransferTrc10(0); + VMConfig.initAllowTvmConstantinople(0); + VMConfig.initAllowTvmSolidity059(0); + VMConfig.initAllowTvmIstanbul(0); + VMConfig.initAllowTvmCompatibleEvm(0); + } + } From fbdfed398f1e29666dfbf2e57902bc869277a0f4 Mon Sep 17 00:00:00 2001 From: Asuka Date: Wed, 29 Sep 2021 14:36:51 +0800 Subject: [PATCH 321/341] code(test): fix style --- .../runtime/vm/AllowTvmCompatibleEvmTest.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/framework/src/test/java/org/tron/common/runtime/vm/AllowTvmCompatibleEvmTest.java b/framework/src/test/java/org/tron/common/runtime/vm/AllowTvmCompatibleEvmTest.java index 4788a0529d8..0b24d357a8a 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/AllowTvmCompatibleEvmTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/AllowTvmCompatibleEvmTest.java @@ -266,13 +266,13 @@ public void testChainId() throws ContractExeException, ReceiptCheckErrException, VMIllegalException, ContractValidateException { String contractName = "TestChainId"; byte[] address = Hex.decode(OWNER_ADDRESS); - String contractCode = "608060405234801561001057600080fd5b5060b58061001f6000" + - "396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c" + - "80633408e47014602d575b600080fd5b60336047565b604051603e9190605c565b6040" + - "5180910390f35b600046905090565b6056816075565b82525050565b60006020820190" + - "50606f6000830184604f565b92915050565b600081905091905056fea2646970667358" + - "2212203ccbe28f012f703b4369308e34d6dfc1a89a5f51e3ea42d531fcf3a2dba31150" + - "64736f6c63430008070033"; + String contractCode = "608060405234801561001057600080fd5b5060b58061001f6000" + + "396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c" + + "80633408e47014602d575b600080fd5b60336047565b604051603e9190605c565b6040" + + "5180910390f35b600046905090565b6056816075565b82525050565b60006020820190" + + "50606f6000830184604f565b92915050565b600081905091905056fea2646970667358" + + "2212203ccbe28f012f703b4369308e34d6dfc1a89a5f51e3ea42d531fcf3a2dba31150" + + "64736f6c63430008070033"; long feeLimit = 100_000_000L; // deploy contract From a4c5c2c7ca1c5f8baca62915d7382ff191f91850 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 29 Sep 2021 15:36:03 +0800 Subject: [PATCH 322/341] feat: add blackhole config --- .../main/java/org/tron/core/capsule/AccountCapsule.java | 5 ++++- framework/src/main/java/org/tron/core/db/Manager.java | 4 ---- .../org/tron/core/db/EnergyPriceHistoryLoaderTest.java | 2 +- framework/src/test/resources/config-test-index.conf | 7 ++++++- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java b/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java index 0cf5d525521..1888724bb5c 100644 --- a/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java +++ b/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java @@ -1108,12 +1108,14 @@ public Permission getPermissionById(int id) { public void updatePermissions(Permission owner, Permission witness, List actives) { Builder builder = this.account.toBuilder(); + owner = owner.toBuilder().setId(0).build(); builder.setOwnerPermission(owner); - if (builder.getIsWitness()) { + if (witness != null && builder.getIsWitness()) { witness = witness.toBuilder().setId(1).build(); builder.setWitnessPermission(witness); } + builder.clearActivePermission(); if (actives != null) { for (int i = 0; i < actives.size(); i++) { @@ -1121,6 +1123,7 @@ public void updatePermissions(Permission owner, Permission witness, List Date: Wed, 29 Sep 2021 16:28:05 +0800 Subject: [PATCH 323/341] add testcase for energy price by http --- .../common/client/utils/HttpMethed.java | 14 +++ .../dailybuild/http/HttpTestProposal001.java | 89 +++++++++---------- 2 files changed, 56 insertions(+), 47 deletions(-) diff --git a/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java b/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java index ca85af28d01..d653d7c7162 100644 --- a/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java +++ b/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java @@ -415,6 +415,20 @@ public static HttpResponse deleteProposal(String httpNode, byte[] ownerAddress, } + /** + * constructor. + */ + public static HttpResponse getEnergyPric(String httpNode) { + try { + final String requestUrl = "http://" + httpNode + "/wallet/getenergyprices"; + response = createConnect(requestUrl); + } catch (Exception e) { + e.printStackTrace(); + httppost.releaseConnection(); + return null; + } + return response; + } /** * constructor. */ diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpTestProposal001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpTestProposal001.java index e9d30c5079e..084dd82a0f6 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpTestProposal001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpTestProposal001.java @@ -16,23 +16,21 @@ public class HttpTestProposal001 { private static Integer proposalId; - private final String testKey002 = Configuration.getByPath("testng.conf") - .getString("foundationAccount.key1"); + private final String testKey002 = + Configuration.getByPath("testng.conf").getString("foundationAccount.key1"); private final byte[] fromAddress = PublicMethed.getFinalAddress(testKey002); - private final String witnessKey001 = Configuration.getByPath("testng.conf") - .getString("witness.key1"); + private final String witnessKey001 = + Configuration.getByPath("testng.conf").getString("witness.key1"); private final byte[] witness1Address = PublicMethed.getFinalAddress(witnessKey001); - private final String witnessKey002 = Configuration.getByPath("testng.conf") - .getString("witness.key2"); + private final String witnessKey002 = + Configuration.getByPath("testng.conf").getString("witness.key2"); private final byte[] witness2Address = PublicMethed.getFinalAddress(witnessKey002); - private String httpnode = Configuration.getByPath("testng.conf").getStringList("httpnode.ip.list") - .get(0); + private String httpnode = + Configuration.getByPath("testng.conf").getStringList("httpnode.ip.list").get(0); private JSONObject responseContent; private HttpResponse response; - /** - * constructor. - */ + /** constructor. */ @Test(enabled = true, description = "Create proposal by http") public void test1CreateProposal() { HttpMethed.waitToProduceOneBlock(httpnode); @@ -41,9 +39,7 @@ public void test1CreateProposal() { HttpMethed.waitToProduceOneBlock(httpnode); } - /** - * * constructor. * - */ + /** * constructor. * */ @Test(enabled = true, description = "List proposals by http") public void test2ListProposals() { response = HttpMethed.listProposals(httpnode); @@ -54,30 +50,26 @@ public void test2ListProposals() { proposalId = jsonArray.size(); } - /** - * constructor. - */ + /** constructor. */ @Test(enabled = true, description = "GetProposalById by http") public void test3GetExchangeById() { response = HttpMethed.getProposalById(httpnode, proposalId); responseContent = HttpMethed.parseResponseContent(response); HttpMethed.printJsonContent(responseContent); Assert.assertTrue(responseContent.getInteger("proposal_id") == proposalId); - Assert.assertEquals(responseContent.getString("proposer_address"), - ByteArray.toHexString(witness1Address)); + Assert.assertEquals( + responseContent.getString("proposer_address"), ByteArray.toHexString(witness1Address)); } - /** - * constructor. - */ + /** constructor. */ @Test(enabled = true, description = "Approval proposal by http") public void test4ApprovalProposal() { - response = HttpMethed - .approvalProposal(httpnode, witness1Address, proposalId, true, witnessKey001); + response = + HttpMethed.approvalProposal(httpnode, witness1Address, proposalId, true, witnessKey001); Assert.assertTrue(HttpMethed.verificationResult(response)); HttpMethed.waitToProduceOneBlock(httpnode); - response = HttpMethed - .approvalProposal(httpnode, witness2Address, proposalId, true, witnessKey002); + response = + HttpMethed.approvalProposal(httpnode, witness2Address, proposalId, true, witnessKey002); Assert.assertTrue(HttpMethed.verificationResult(response)); HttpMethed.waitToProduceOneBlock(httpnode); response = HttpMethed.getProposalById(httpnode, proposalId); @@ -87,10 +79,7 @@ public void test4ApprovalProposal() { Assert.assertTrue(jsonArray.size() == 2); } - - /** - * * constructor. * - */ + /** * constructor. * */ @Test(enabled = true, description = "Get paginated proposal list by http") public void test5GetPaginatedProposalList() { @@ -103,9 +92,7 @@ public void test5GetPaginatedProposalList() { Assert.assertTrue(jsonArray.size() == 1); } - /** - * constructor. - */ + /** constructor. */ @Test(enabled = true, description = "Delete proposal by http") public void test6DeleteProposal() { response = HttpMethed.deleteProposal(httpnode, witness1Address, proposalId, witnessKey001); @@ -117,32 +104,40 @@ public void test6DeleteProposal() { Assert.assertEquals(responseContent.getString("state"), "CANCELED"); } - - /** - * constructor. - */ + /** constructor. */ @Test(enabled = true, description = "Get chain parameters by http") public void test7GetChainParameters() { response = HttpMethed.getChainParameters(httpnode); HttpMethed.waitToProduceOneBlock(httpnode); responseContent = HttpMethed.parseResponseContent(response); HttpMethed.printJsonContent(responseContent); - Assert.assertEquals("getMaintenanceTimeInterval", + Assert.assertEquals( + "getMaintenanceTimeInterval", responseContent.getJSONArray("chainParameter").getJSONObject(0).get("key")); - Assert.assertEquals(300000, - responseContent.getJSONArray("chainParameter").getJSONObject(0).get("value")); - Assert.assertEquals("getCreateAccountFee", + Assert.assertEquals( + 300000, responseContent.getJSONArray("chainParameter").getJSONObject(0).get("value")); + Assert.assertEquals( + "getCreateAccountFee", responseContent.getJSONArray("chainParameter").getJSONObject(2).get("key")); - Assert.assertEquals(100000, - responseContent.getJSONArray("chainParameter").getJSONObject(2).get("value")); + Assert.assertEquals( + 100000, responseContent.getJSONArray("chainParameter").getJSONObject(2).get("value")); + } + /** constructor. */ + @Test(enabled = true, description = "Get energy price by http") + public void test8GetEnergyPrice() { + response = HttpMethed.getEnergyPric(httpnode); + HttpMethed.waitToProduceOneBlock(httpnode); + responseContent = HttpMethed.parseResponseContent(response); + HttpMethed.printJsonContent(responseContent); + String prices = responseContent.getString("prices"); + String expectPrices = "0:100"; + logger.info("prices:" + prices); + Assert.assertEquals(prices, expectPrices); } - /** - * constructor. - */ + /** constructor. */ @AfterClass public void shutdown() throws InterruptedException { HttpMethed.disConnect(); } } - From 5d6bfd795ff42628a4280eb2883aee9f5d2680a3 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 29 Sep 2021 17:26:32 +0800 Subject: [PATCH 324/341] test: try to modity NodeManagerTest --- .../discover/node/NodeManagerTest.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/framework/src/test/java/org/tron/common/overlay/discover/node/NodeManagerTest.java b/framework/src/test/java/org/tron/common/overlay/discover/node/NodeManagerTest.java index d5706b847a0..f5b870bacdf 100644 --- a/framework/src/test/java/org/tron/common/overlay/discover/node/NodeManagerTest.java +++ b/framework/src/test/java/org/tron/common/overlay/discover/node/NodeManagerTest.java @@ -79,15 +79,16 @@ public static void destroy() { // @Before public static void initManager() throws Exception { nodeManagerClazz = NodeManager.class; - Constructor handlerConstructor - = nodeManagerClazz.getConstructor(ChainBaseManager.class); + // Constructor handlerConstructor + // = nodeManagerClazz.getConstructor(ChainBaseManager.class); manager = context.getBean(Manager.class); - nodeManager = handlerConstructor.newInstance(context.getBean(ChainBaseManager.class)); + // nodeManager = handlerConstructor.newInstance(context.getBean(ChainBaseManager.class)); + nodeManager = new NodeManager(context.getBean(ChainBaseManager.class)); } @Test public void isNodeAliveTest() { - Node node = new Node(new byte[64], "128.0.0.1", 18888, 18888); + Node node = new Node(new byte[64], "128.0.0.1", 18889, 18889); nodeManager.getTable().addNode(node); NodeHandler nodeHandler = new NodeHandler(node, nodeManager); nodeHandler.changeState(NodeHandler.State.ACTIVE); @@ -167,7 +168,7 @@ public int insertValues(int totalNodes) throws Exception { Class nodeClazz = Node.class; Constructor nodeConstructor = nodeClazz.getConstructor(byte[].class, String.class, int.class, int.class); - Node node = nodeConstructor.newInstance(bytes, stringBuilder.toString(), 18888, 18888); + Node node = nodeConstructor.newInstance(bytes, stringBuilder.toString(), 18889, 18889); Field isConnectableField = nodeClazz.getDeclaredField("p2pVersion"); isConnectableField.setAccessible(true); isConnectableField.set(node, Args.getInstance().getNodeP2pVersion()); @@ -183,10 +184,10 @@ public void insertNotConnectibleNodes() throws Exception { Class nodeClazz = Node.class; Constructor nodeConstructor = nodeClazz.getConstructor(byte[].class, String.class, int.class, int.class); - Node wrongNode1 = nodeConstructor.newInstance(new byte[64], "128.0.0.1", 1111, 18888); + Node wrongNode1 = nodeConstructor.newInstance(new byte[64], "128.0.0.1", 1111, 18889); byte[] id = new byte[64]; id[63] = 1; - Node wrongNode2 = nodeConstructor.newInstance(id, "128.0.0.2", 1111, 18888); + Node wrongNode2 = nodeConstructor.newInstance(id, "128.0.0.2", 1111, 18889); Field isConnectableField = nodeClazz.getDeclaredField("p2pVersion"); isConnectableField.setAccessible(true); isConnectableField.set(wrongNode1, 999); @@ -210,9 +211,9 @@ public int getHandlerMapSize() throws Exception { @Test public void dumpActiveNodesTest() { - Node node1 = new Node(new byte[64], "128.0.0.1", 18888, 18888); - Node node2 = new Node(new byte[64], "128.0.0.2", 18888, 18888); - Node node3 = new Node(new byte[64], "128.0.0.3", 18888, 18888); + Node node1 = new Node(new byte[64], "128.0.0.1", 18889, 18889); + Node node2 = new Node(new byte[64], "128.0.0.2", 18889, 18889); + Node node3 = new Node(new byte[64], "128.0.0.3", 18889, 18889); NodeHandler nodeHandler1 = nodeManager.getNodeHandler(node1); NodeHandler nodeHandler2 = nodeManager.getNodeHandler(node2); NodeHandler nodeHandler3 = nodeManager.getNodeHandler(node3); From 10b753678f35e4ccd1cf227be822b3acfae3d5b0 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Wed, 29 Sep 2021 17:33:51 +0800 Subject: [PATCH 325/341] test: removed unused code --- .../overlay/discover/node/NodeHandlerTest.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/framework/src/test/java/org/tron/common/overlay/discover/node/NodeHandlerTest.java b/framework/src/test/java/org/tron/common/overlay/discover/node/NodeHandlerTest.java index 98e5e6da913..dfe24f8e644 100644 --- a/framework/src/test/java/org/tron/common/overlay/discover/node/NodeHandlerTest.java +++ b/framework/src/test/java/org/tron/common/overlay/discover/node/NodeHandlerTest.java @@ -9,24 +9,21 @@ import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.tron.common.application.Application; import org.tron.common.application.TronApplicationContext; -import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.FileUtil; import org.tron.core.ChainBaseManager; import org.tron.core.Constant; import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; public class NodeHandlerTest { private static final Logger logger = LoggerFactory.getLogger("Test"); - private static Manager dbManager; + // private static Manager dbManager; private static TronApplicationContext context; - private Application appTest; - private CommonParameter argsTest; + // private Application appTest; + // private CommonParameter argsTest; private static Node currNode; private static Node oldNode; private static Node replaceNode; @@ -67,7 +64,7 @@ public static void destroy() { * init nodes. */ public static void initNodes() { - dbManager = context.getBean(Manager.class); + // dbManager = context.getBean(Manager.class); nodeManager = new NodeManager(context.getBean(ChainBaseManager.class)); String currNodeId = "74c11ffad1d59d7b1a56691a0b84a53f0791c92361357364f1d2537" + "898407ef0249bbbf5a4ce8cff9e34e2fdf8bac883540e026d1e5d6ebf536414bdde81198e"; @@ -97,7 +94,7 @@ public void stateNonActiveTest() throws Exception { nh.changeState(NodeHandler.State.NONACTIVE); replaceHandler.changeState(NodeHandler.State.ALIVE); - Assert.assertTrue(!nodeManager.getTable().contains(oldNode)); + Assert.assertFalse(nodeManager.getTable().contains(oldNode)); Assert.assertTrue(nodeManager.getTable().contains(replaceNode)); } } From 083eeb145c7373c47f6d224b54209b2dd81c2441 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Wed, 29 Sep 2021 18:19:21 +0800 Subject: [PATCH 326/341] modify repush queue process --- .../java/org/tron/core/db/PendingManager.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/PendingManager.java b/framework/src/main/java/org/tron/core/db/PendingManager.java index b9adebe74ba..c4275056237 100644 --- a/framework/src/main/java/org/tron/core/db/PendingManager.java +++ b/framework/src/main/java/org/tron/core/db/PendingManager.java @@ -1,6 +1,7 @@ package org.tron.core.db; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import lombok.extern.slf4j.Slf4j; import org.tron.core.capsule.TransactionCapsule; @@ -21,15 +22,13 @@ public PendingManager(Manager db) { @Override public void close() { - List list = new ArrayList<>(); - dbManager.getRePushTransactions().forEach(capsule -> { - if (System.currentTimeMillis() - capsule.getTime() < timeout) { - list.add(capsule); + long now = System.currentTimeMillis(); + Iterator iterator = dbManager.getRePushTransactions().iterator(); + while (iterator.hasNext()){ + if (now - iterator.next().getTime() > timeout){ + iterator.remove(); } - }); - - dbManager.getRePushTransactions().clear(); - dbManager.getRePushTransactions().addAll(list); + } for (TransactionCapsule tx : dbManager.getPendingTransactions()) { txIteration(tx); From 35a1562fc60c6ef9bab30280bc9b58aa8a01eff5 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Wed, 29 Sep 2021 19:31:07 +0800 Subject: [PATCH 327/341] solve checkstyle problem --- .../src/main/java/org/tron/core/db/PendingManager.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/PendingManager.java b/framework/src/main/java/org/tron/core/db/PendingManager.java index c4275056237..9048925dda3 100644 --- a/framework/src/main/java/org/tron/core/db/PendingManager.java +++ b/framework/src/main/java/org/tron/core/db/PendingManager.java @@ -1,8 +1,6 @@ package org.tron.core.db; -import java.util.ArrayList; import java.util.Iterator; -import java.util.List; import lombok.extern.slf4j.Slf4j; import org.tron.core.capsule.TransactionCapsule; import org.tron.core.config.args.Args; @@ -24,8 +22,8 @@ public void close() { long now = System.currentTimeMillis(); Iterator iterator = dbManager.getRePushTransactions().iterator(); - while (iterator.hasNext()){ - if (now - iterator.next().getTime() > timeout){ + while (iterator.hasNext()) { + if (now - iterator.next().getTime() > timeout) { iterator.remove(); } } From e2fa3ce667b06abed7a0afbaa55dd8c37f72fa49 Mon Sep 17 00:00:00 2001 From: liqi <1242201319@qq.com> Date: Thu, 30 Sep 2021 12:14:27 +0800 Subject: [PATCH 328/341] modify testcase --- .../java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java index 37f06ef8c80..c991126aec8 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java @@ -123,7 +123,7 @@ public void test04JsonRpcApiTestForEthChainId() throws Exception { String blockIdFromJsonRpcNode = responseContent.get("result").toString().substring(2); response = HttpMethed.getBlockByNum(httpFullNode, 0); responseContent = HttpMethed.parseResponseContent(response); - String blockIdFromHttp = responseContent.getString("blockID"); + String blockIdFromHttp = responseContent.getString("blockID").substring(56); logger.info("blockIdFromJsonRpcNode:" + blockIdFromJsonRpcNode); logger.info("blockIdFromHttp:" + blockIdFromHttp); Assert.assertEquals(blockIdFromJsonRpcNode, blockIdFromHttp); From 19564829ca5af373f77fab4e3a019d6021321cb0 Mon Sep 17 00:00:00 2001 From: liqi <1242201319@qq.com> Date: Fri, 8 Oct 2021 11:33:04 +0800 Subject: [PATCH 329/341] modify testcase --- .../tron/wallet/dailybuild/jsonrpc/Accounts001.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java index c991126aec8..5f1ddf3e4ae 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java @@ -588,8 +588,7 @@ public void test18JsonRpcApiTestForEthGetTransactionReceipt() throws Exception { logs.getJSONObject(0).getString("transactionHash"), resultFromTransactionReceipt.getString("transactionHash")); Assert.assertEquals( - logs.getJSONObject(0).getString("address"),resultFromTransactionReceipt.getString("to") - ); + logs.getJSONObject(0).getString("address"), resultFromTransactionReceipt.getString("to")); response = HttpMethed.getTransactionInfoByBlocknum(httpFullNode, blockNumForTrc20); List responseContent1 = HttpMethed.parseResponseContentArray(response); logger.info("responseContent1:" + responseContent1); @@ -759,13 +758,13 @@ public void test30JsonRpcApiTestForEthVersion() throws Exception { JsonObject requestBody = getJsonRpcBody("net_version", params); response = getJsonRpc(jsonRpcNode, requestBody); responseContent = HttpMethed.parseResponseContent(response); - String firstBlockHash1 = responseContent.getString("result").substring(2); + String firstBlockHashFromJsonRpc = responseContent.getString("result").substring(2); response = HttpMethed.getBlockByNum(httpFullNode, 0); responseContent = HttpMethed.parseResponseContent(response); - String firstBlockHash2 = responseContent.getString("blockID"); - logger.info(firstBlockHash1); - logger.info(firstBlockHash2); - Assert.assertEquals(firstBlockHash1, firstBlockHash2); + String firstBlockHashFromHttp = responseContent.getString("blockID").substring(56); + logger.info("firstBlockHashFromJsonRpc" + firstBlockHashFromJsonRpc); + logger.info("firstBlockHashFromHttp" + firstBlockHashFromHttp); + Assert.assertEquals(firstBlockHashFromJsonRpc, firstBlockHashFromHttp); } @Test(enabled = true, description = "Json rpc api of web3_clientVersion") From 34a39b16998739ad8c6068b55fa4020ce2200a38 Mon Sep 17 00:00:00 2001 From: sophiawang <1975054324@qq.com> Date: Fri, 8 Oct 2021 11:46:11 +0800 Subject: [PATCH 330/341] fix case for chainid --- .../tvmnewcommand/istanbul/ChainidAndSelfBalance001.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/istanbul/ChainidAndSelfBalance001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/istanbul/ChainidAndSelfBalance001.java index b46c56d2ca4..0952e16203f 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/istanbul/ChainidAndSelfBalance001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/istanbul/ChainidAndSelfBalance001.java @@ -75,7 +75,8 @@ public void chainidTest001() { String chainIdHex = ByteArray.toHexString(returns.getConstantResult(0).toByteArray()); BlockExtention blockZero = PublicMethed.getBlock2(0, blockingStubFull); - String blockZeroId = ByteArray.toHexString(blockZero.getBlockid().toByteArray()); + String tem = ByteArray.toHexString(blockZero.getBlockid().toByteArray()).substring(56); + String blockZeroId = "00000000000000000000000000000000000000000000000000000000"+tem; Assert.assertEquals(chainIdHex,blockZeroId); } From 3c45fa25fd1336ba6e71e5f13763333e43f1859c Mon Sep 17 00:00:00 2001 From: sophiawang <1975054324@qq.com> Date: Fri, 8 Oct 2021 14:43:16 +0800 Subject: [PATCH 331/341] fix check style --- .../istanbul/ChainidAndSelfBalance001.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/istanbul/ChainidAndSelfBalance001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/istanbul/ChainidAndSelfBalance001.java index 0952e16203f..f9770923984 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/istanbul/ChainidAndSelfBalance001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/istanbul/ChainidAndSelfBalance001.java @@ -70,15 +70,15 @@ public void chainidTest001() { String methodStr = "getId()"; TransactionExtention returns = PublicMethed .triggerConstantContractForExtention(contractAddress, methodStr, "#", - false, 0, maxFeeLimit,"0",0, testAddress001, testKey001, blockingStubFull); + false, 0, maxFeeLimit, "0", 0, testAddress001, testKey001, blockingStubFull); String chainIdHex = ByteArray.toHexString(returns.getConstantResult(0).toByteArray()); BlockExtention blockZero = PublicMethed.getBlock2(0, blockingStubFull); String tem = ByteArray.toHexString(blockZero.getBlockid().toByteArray()).substring(56); - String blockZeroId = "00000000000000000000000000000000000000000000000000000000"+tem; + String blockZeroId = "00000000000000000000000000000000000000000000000000000000" + tem; - Assert.assertEquals(chainIdHex,blockZeroId); + Assert.assertEquals(chainIdHex, blockZeroId); } /* @@ -99,7 +99,7 @@ public void getBalanceTest001() { Long contractBalance = PublicMethed .queryAccount(contractAddress, blockingStubFull).getBalance(); - Assert.assertEquals(contractBalance,getBalance); + Assert.assertEquals(contractBalance, getBalance); } @@ -117,7 +117,7 @@ public void getBalanceTest002() { Long contractBalance = PublicMethed .queryAccount(contractAddress, blockingStubFull).getBalance(); - Assert.assertEquals(contractBalance,getBalance); + Assert.assertEquals(contractBalance, getBalance); } @@ -133,7 +133,7 @@ public void getBalanceTest003() { Long accountBalance = PublicMethed .queryAccount(testFoundationAddress, blockingStubFull).getBalance(); - Assert.assertEquals(accountBalance,getBalance); + Assert.assertEquals(accountBalance, getBalance); } @@ -149,7 +149,7 @@ public void getBalanceTest004() { false, 0, maxFeeLimit, "", 0, testAddress001, testKey001, blockingStubFull); Long getBalance = ByteArray.toLong(returns.getConstantResult(0).toByteArray()); - Assert.assertEquals(0,getBalance.longValue()); + Assert.assertEquals(0, getBalance.longValue()); } From a11edf858852e96c0ce27b61474caa0e5392d08d Mon Sep 17 00:00:00 2001 From: sophiawang <1975054324@qq.com> Date: Fri, 8 Oct 2021 14:50:58 +0800 Subject: [PATCH 332/341] fix check style --- .../stest/tron/wallet/common/client/utils/HttpMethed.java | 5 +++-- .../tron/wallet/dailybuild/http/HttpTestProposal001.java | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java b/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java index d653d7c7162..b3cad3f11dd 100644 --- a/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java +++ b/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java @@ -432,6 +432,7 @@ public static HttpResponse getEnergyPric(String httpNode) { /** * constructor. */ + public static HttpResponse getChainParameters(String httpNode) { try { final String requestUrl = "http://" + httpNode + "/wallet/getchainparameters"; @@ -5307,11 +5308,11 @@ public static HttpResponse getTransactionListFromPending(String httpNode) { /** * constructor. */ - public static HttpResponse getTransactionFromPending(String httpNode,String txid) { + public static HttpResponse getTransactionFromPending(String httpNode, String txid) { try { String requestUrl = "http://" + httpNode + "/wallet/gettransactionfrompending"; JsonObject userBaseObj2 = new JsonObject(); - userBaseObj2.addProperty("value",txid); + userBaseObj2.addProperty("value", txid); response = createConnect(requestUrl, userBaseObj2); } catch (Exception e) { e.printStackTrace(); diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpTestProposal001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpTestProposal001.java index 084dd82a0f6..8fdaa8ddaa3 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpTestProposal001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpTestProposal001.java @@ -123,6 +123,7 @@ public void test7GetChainParameters() { 100000, responseContent.getJSONArray("chainParameter").getJSONObject(2).get("value")); } /** constructor. */ + @Test(enabled = true, description = "Get energy price by http") public void test8GetEnergyPrice() { response = HttpMethed.getEnergyPric(httpnode); From 9f3ff13936a5478529a8298e87d91dc8176d55da Mon Sep 17 00:00:00 2001 From: sophiawang <1975054324@qq.com> Date: Mon, 11 Oct 2021 17:31:13 +0800 Subject: [PATCH 333/341] fix ubuntu oom --- framework/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/build.gradle b/framework/build.gradle index 68f093c4d86..1cd0bf64e14 100644 --- a/framework/build.gradle +++ b/framework/build.gradle @@ -136,6 +136,7 @@ run { } test { + maxHeapSize = "4096m" testLogging { exceptionFormat = 'full' } From 722d90f8535e6280d8fecb66522f83bc53b33452 Mon Sep 17 00:00:00 2001 From: sophiawang <1975054324@qq.com> Date: Mon, 11 Oct 2021 18:02:34 +0800 Subject: [PATCH 334/341] revert fix --- framework/build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/framework/build.gradle b/framework/build.gradle index 1cd0bf64e14..68f093c4d86 100644 --- a/framework/build.gradle +++ b/framework/build.gradle @@ -136,7 +136,6 @@ run { } test { - maxHeapSize = "4096m" testLogging { exceptionFormat = 'full' } From 024ba60b8c83dde402b51f9c87dc01eb86f120e0 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Tue, 12 Oct 2021 18:50:06 +0800 Subject: [PATCH 335/341] feat: add getCursor to Chainbase --- .../main/java/org/tron/core/db2/common/IRevokingDB.java | 2 ++ .../src/main/java/org/tron/core/db2/core/Chainbase.java | 9 +++++++++ .../core/db2/core/RevokingDBWithCachingOldValue.java | 9 +++++++++ 3 files changed, 20 insertions(+) diff --git a/chainbase/src/main/java/org/tron/core/db2/common/IRevokingDB.java b/chainbase/src/main/java/org/tron/core/db2/common/IRevokingDB.java index c39d0782720..445972417df 100644 --- a/chainbase/src/main/java/org/tron/core/db2/common/IRevokingDB.java +++ b/chainbase/src/main/java/org/tron/core/db2/common/IRevokingDB.java @@ -27,6 +27,8 @@ public interface IRevokingDB extends Iterable> { void setCursor(Chainbase.Cursor cursor, long offset); + Chainbase.Cursor getCursor(); + // for blockstore Set getlatestValues(long limit); diff --git a/chainbase/src/main/java/org/tron/core/db2/core/Chainbase.java b/chainbase/src/main/java/org/tron/core/db2/core/Chainbase.java index c625a0f18a5..ee77c6cbc1b 100644 --- a/chainbase/src/main/java/org/tron/core/db2/core/Chainbase.java +++ b/chainbase/src/main/java/org/tron/core/db2/core/Chainbase.java @@ -56,6 +56,15 @@ public void setCursor(Cursor cursor, long offset) { this.offset.set(offset); } + @Override + public Cursor getCursor() { + if (cursor.get() == null) { + return Cursor.HEAD; + } else { + return cursor.get(); + } + } + private Snapshot head() { if (cursor.get() == null) { return head; diff --git a/chainbase/src/main/java/org/tron/core/db2/core/RevokingDBWithCachingOldValue.java b/chainbase/src/main/java/org/tron/core/db2/core/RevokingDBWithCachingOldValue.java index d8242f75e57..89dd75597af 100644 --- a/chainbase/src/main/java/org/tron/core/db2/core/RevokingDBWithCachingOldValue.java +++ b/chainbase/src/main/java/org/tron/core/db2/core/RevokingDBWithCachingOldValue.java @@ -16,6 +16,7 @@ import org.tron.core.db.AbstractRevokingStore; import org.tron.core.db.RevokingStore; import org.tron.core.db2.common.IRevokingDB; +import org.tron.core.db2.core.Chainbase.Cursor; import org.tron.core.exception.ItemNotFoundException; @Slf4j @@ -116,7 +117,15 @@ public void setCursor(Chainbase.Cursor cursor) { @Override public void setCursor(Chainbase.Cursor cursor, long offset) { + } + /** + * This should be never called + */ + @Override + public Chainbase.Cursor getCursor() { + logger.error("RevokingDBWithCachingOldValue getCursor is called, this should not be happened"); + return Cursor.HEAD; } /** From 4e588593b08ef0453edf1dc0ecd355b15aead2f4 Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Tue, 12 Oct 2021 19:05:21 +0800 Subject: [PATCH 336/341] feat: disable buildTransaction in solidity and pbft --- .../src/main/java/org/tron/core/Wallet.java | 5 ++++ .../core/services/jsonrpc/TronJsonRpc.java | 3 +- .../services/jsonrpc/TronJsonRpcImpl.java | 29 ++++++++++++++++++- 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index e00cbccbcab..ce61cdb915e 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -154,6 +154,7 @@ import org.tron.core.db.EnergyProcessor; import org.tron.core.db.Manager; import org.tron.core.db.TransactionContext; +import org.tron.core.db2.core.Chainbase; import org.tron.core.exception.AccountResourceInsufficientException; import org.tron.core.exception.BadItemException; import org.tron.core.exception.ContractExeException; @@ -3957,5 +3958,9 @@ public boolean isMining() { return false; } + + public Chainbase.Cursor getCursor() { + return chainBaseManager.getBlockStore().getRevokingDB().getCursor(); + } } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index 6bae375d949..efb40cc680f 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -252,12 +252,13 @@ String getCall(CallArguments transactionCall, String blockNumOrTag) @JsonRpcMethod("buildTransaction") @JsonRpcErrors({ @JsonRpcError(exception = JsonRpcInvalidRequestException.class, code = -32600, data = "{}"), + @JsonRpcError(exception = JsonRpcMethodNotFoundException.class, code = -32601, data = "{}"), @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), @JsonRpcError(exception = JsonRpcInternalException.class, code = -32000, data = "{}"), }) TransactionJson buildTransaction(BuildArguments args) throws JsonRpcInvalidParamsException, JsonRpcInvalidRequestException, - JsonRpcInternalException; + JsonRpcInternalException, JsonRpcMethodNotFoundException; // not supported @JsonRpcMethod("eth_submitWork") diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 31715937eae..280bd325b62 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -35,6 +35,7 @@ import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.TransactionCapsule; import org.tron.core.db.Manager; +import org.tron.core.db2.core.Chainbase; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.HeaderNotFound; @@ -66,6 +67,12 @@ @Slf4j(topic = "API") public class TronJsonRpcImpl implements TronJsonRpc { + public enum RequestSource { + FULLNODE, + SOLIDITY, + PBFT + } + String regexHash = "(0x)?[a-zA-Z0-9]{64}$"; private final int chainId = 100; private final int networkId = 100; @@ -888,10 +895,30 @@ private TransactionJson buildTransferAssetContractTransaction(byte[] ownerAddres return createTransactionJson(build, ContractType.TransferAssetContract, args); } + public RequestSource getSource() { + Chainbase.Cursor cursor = wallet.getCursor(); + switch (cursor) { + case SOLIDITY: + return RequestSource.SOLIDITY; + case PBFT: + return RequestSource.PBFT; + default: + return RequestSource.FULLNODE; + } + } + @Override public TransactionJson buildTransaction(BuildArguments args) throws JsonRpcInvalidParamsException, JsonRpcInvalidRequestException, - JsonRpcInternalException { + JsonRpcInternalException, JsonRpcMethodNotFoundException { + + if (getSource() != RequestSource.FULLNODE) { + String msg = String + .format("the method buildTransaction does not exist/is not available in %s", + getSource().toString()); + throw new JsonRpcMethodNotFoundException(msg); + } + byte[] fromAddressData; try { fromAddressData = addressHashToByteArray(args.from); From ad1cecfa9d66727dd06b192dc32b6cce8f80b4ef Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Tue, 12 Oct 2021 19:19:40 +0800 Subject: [PATCH 337/341] typo: update config --- .../java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java | 2 -- framework/src/main/resources/config.conf | 5 +++-- .../src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java | 1 - 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index 681fdc44b2b..c44f3f1911a 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -19,7 +19,6 @@ import org.tron.common.utils.Sha256Hash; import org.tron.common.utils.StringUtil; import org.tron.core.Wallet; -import org.tron.core.capsule.ContractCapsule; import org.tron.core.exception.JsonRpcInvalidParamsException; import org.tron.protos.Protocol.Block; import org.tron.protos.Protocol.Transaction; @@ -39,7 +38,6 @@ import org.tron.protos.contract.ExchangeContract.ExchangeWithdrawContract; import org.tron.protos.contract.ShieldContract.ShieldedTransferContract; import org.tron.protos.contract.SmartContractOuterClass.ClearABIContract; -import org.tron.protos.contract.SmartContractOuterClass.CreateSmartContract; import org.tron.protos.contract.SmartContractOuterClass.TriggerSmartContract; import org.tron.protos.contract.SmartContractOuterClass.UpdateEnergyLimitContract; import org.tron.protos.contract.SmartContractOuterClass.UpdateSettingContract; diff --git a/framework/src/main/resources/config.conf b/framework/src/main/resources/config.conf index 6da6b6abea2..dda18b2665f 100644 --- a/framework/src/main/resources/config.conf +++ b/framework/src/main/resources/config.conf @@ -226,9 +226,10 @@ node { # httpPBFTPort = 8565 } - # disabled api list, it will work for http, rpc and pbft, both fullnode and soliditynode, + # Disabled api list, it will work for http, rpc and pbft, both fullnode and soliditynode, # but not jsonrpc. - # The setting is case insensitive, GetNowBlock2 is equal to getnowblock2 + # Sample: The setting is case insensitive, GetNowBlock2 is equal to getnowblock2 + # # disabledApi = [ # "getaccount", # "getnowblock2" diff --git a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java index 52213f3415d..7c9d2f5ba23 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java @@ -5,7 +5,6 @@ import org.bouncycastle.util.encoders.Hex; import org.junit.Assert; -import org.junit.Ignore; import org.junit.Test; import org.tron.common.crypto.Hash; import org.tron.common.runtime.vm.DataWord; From 5a507e0b4ebc80d9368ee9a87373387756f08690 Mon Sep 17 00:00:00 2001 From: liukai Date: Thu, 14 Oct 2021 14:33:57 +0800 Subject: [PATCH 338/341] change version 4.4.0 --- framework/src/main/java/org/tron/program/Version.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/program/Version.java b/framework/src/main/java/org/tron/program/Version.java index 106230f26d4..1b245d91923 100644 --- a/framework/src/main/java/org/tron/program/Version.java +++ b/framework/src/main/java/org/tron/program/Version.java @@ -4,7 +4,7 @@ public class Version { public static final String VERSION_NAME = "GreatVoyage-v4.2.2.1-281-gc1d9dfd6c"; public static final String VERSION_CODE = "15872"; - private static final String VERSION = "4.3.0"; + private static final String VERSION = "4.4.0"; public static String getVersion() { return VERSION; From 9198137bf8707bf9ca7e7d0cd61df01f175a478c Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Thu, 14 Oct 2021 18:31:33 +0800 Subject: [PATCH 339/341] fix: fix miner address, remove pre 41 --- .../java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 280bd325b62..80d63382d2b 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -189,7 +189,7 @@ private BlockResult getBlockResult(Block block, boolean fullTx) { br.stateRoot = ByteArray .toJsonHex(block.getBlockHeader().getRawData().getAccountStateRoot().toByteArray()); br.receiptsRoot = null; // no value - br.miner = ByteArray.toJsonHex(blockCapsule.getWitnessAddress().toByteArray()); + br.miner = ByteArray.toJsonHexAddress(blockCapsule.getWitnessAddress().toByteArray()); br.difficulty = null; // no value br.totalDifficulty = null; // no value br.extraData = null; // no value From ed0c7bae0e8096ebfcde164d7381ae4d70189192 Mon Sep 17 00:00:00 2001 From: liukai Date: Thu, 14 Oct 2021 19:14:38 +0800 Subject: [PATCH 340/341] modify shutdownhook catch interrupt --- .../src/main/java/org/tron/core/config/TronLogShutdownHook.java | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/src/main/java/org/tron/core/config/TronLogShutdownHook.java b/framework/src/main/java/org/tron/core/config/TronLogShutdownHook.java index 512ecf3ab62..880aa7e3090 100644 --- a/framework/src/main/java/org/tron/core/config/TronLogShutdownHook.java +++ b/framework/src/main/java/org/tron/core/config/TronLogShutdownHook.java @@ -34,6 +34,7 @@ public void run() { Thread.sleep(CHECK_SHUTDOWN_DELAY.getMilliseconds()); } } catch (InterruptedException e) { + Thread.currentThread().interrupt(); addInfo("TronLogShutdownHook run error :" + e.getMessage()); } super.stop(); From cd83f42225f10a24e9fefbd8af0aeb664e7ed68a Mon Sep 17 00:00:00 2001 From: Wenhua Zhang Date: Fri, 15 Oct 2021 11:16:22 +0800 Subject: [PATCH 341/341] feat: use Thread.currentThread().getContextClassLoader() instead of this.getClass().getClassLoader() --- .../java/org/tron/core/services/jsonrpc/JsonRpcServlet.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java index f2bd85c4da3..2b5387f6149 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcServlet.java @@ -33,9 +33,10 @@ public class JsonRpcServlet extends RateLimiterServlet { public void init(ServletConfig config) throws ServletException { super.init(config); + ClassLoader cl = Thread.currentThread().getContextClassLoader(); TronJsonRpcImpl jsonRpcImpl = new TronJsonRpcImpl(nodeInfoService, wallet, manager); Object compositeService = ProxyUtil.createCompositeServiceProxy( - this.getClass().getClassLoader(), + cl, new Object[] {jsonRpcImpl}, new Class[] {TronJsonRpc.class}, true);