mirror of
https://gitee.com/BDWare/cp.git
synced 2025-01-10 01:44:08 +00:00
build: config spotless plugin and reformat code
This commit is contained in:
parent
587310c899
commit
0e5f92e51e
@ -5,6 +5,8 @@ plugins {
|
|||||||
id 'signing'
|
id 'signing'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
apply from: '../spotless.gradle'
|
||||||
|
|
||||||
group = "org.bdware.sc"
|
group = "org.bdware.sc"
|
||||||
version = "1.9.0"
|
version = "1.9.0"
|
||||||
tasks.withType(JavaCompile) {
|
tasks.withType(JavaCompile) {
|
||||||
|
@ -16,8 +16,6 @@ import com.alibaba.datax.plugin.rdbms.util.DBUtil;
|
|||||||
import com.alibaba.datax.plugin.rdbms.util.DBUtilErrorCode;
|
import com.alibaba.datax.plugin.rdbms.util.DBUtilErrorCode;
|
||||||
import com.alibaba.datax.plugin.rdbms.util.DataBaseType;
|
import com.alibaba.datax.plugin.rdbms.util.DataBaseType;
|
||||||
import com.alibaba.datax.plugin.rdbms.util.RdbmsException;
|
import com.alibaba.datax.plugin.rdbms.util.RdbmsException;
|
||||||
import com.google.gson.Gson;
|
|
||||||
import com.google.gson.GsonBuilder;
|
|
||||||
import com.google.gson.JsonPrimitive;
|
import com.google.gson.JsonPrimitive;
|
||||||
import org.apache.commons.lang3.Validate;
|
import org.apache.commons.lang3.Validate;
|
||||||
import org.bdware.sc.util.JsonUtil;
|
import org.bdware.sc.util.JsonUtil;
|
||||||
@ -47,8 +45,8 @@ public class MaskingJob {
|
|||||||
|
|
||||||
public void init(String confContent) {
|
public void init(String confContent) {
|
||||||
maskConf = Configuration.from(confContent);
|
maskConf = Configuration.from(confContent);
|
||||||
System.out.println("maskConf"+maskConf.toString());
|
System.out.println("maskConf" + maskConf.toString());
|
||||||
System.out.println(("maskCOnfjob"+maskConf.get("job").toString()));
|
System.out.println(("maskCOnfjob" + maskConf.get("job").toString()));
|
||||||
readerPara = maskConf.getConfiguration(CoreConstant.DATAX_JOB_CONTENT_READER_PARAMETER);
|
readerPara = maskConf.getConfiguration(CoreConstant.DATAX_JOB_CONTENT_READER_PARAMETER);
|
||||||
System.out.println(readerPara);
|
System.out.println(readerPara);
|
||||||
username = readerPara.getString(Key.USERNAME);
|
username = readerPara.getString(Key.USERNAME);
|
||||||
@ -56,16 +54,19 @@ public class MaskingJob {
|
|||||||
jdbcUrl = readerPara.getString(Key.JDBC_URL);
|
jdbcUrl = readerPara.getString(Key.JDBC_URL);
|
||||||
table = readerPara.getString(Key.TABLE);
|
table = readerPara.getString(Key.TABLE);
|
||||||
buffer = new ArrayList<>();
|
buffer = new ArrayList<>();
|
||||||
System.out.println("maskConf11"+maskConf.getConfiguration(CoreConstant.DATAX_JOB_CONTENT + "[0]"));
|
System.out.println(
|
||||||
transformerExecs = TransformerUtil.buildTransformerInfo(maskConf.getConfiguration(CoreConstant.DATAX_JOB_CONTENT + "[0]"));
|
"maskConf11" + maskConf.getConfiguration(CoreConstant.DATAX_JOB_CONTENT + "[0]"));
|
||||||
|
transformerExecs = TransformerUtil.buildTransformerInfo(
|
||||||
|
maskConf.getConfiguration(CoreConstant.DATAX_JOB_CONTENT + "[0]"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public String buildQuerySql() {
|
public String buildQuerySql() {
|
||||||
String column = "*";
|
String column = "*";
|
||||||
//String column = readerPara.getString(Key.COLUMN);
|
// String column = readerPara.getString(Key.COLUMN);
|
||||||
String table = readerPara.getString(Key.TABLE);
|
String table = readerPara.getString(Key.TABLE);
|
||||||
String where = readerPara.getString(Key.WHERE, null);
|
String where = readerPara.getString(Key.WHERE, null);
|
||||||
//String querySql = SingleTableSplitUtil.buildQuerySql(column, table, where) + " limit 100";
|
// String querySql = SingleTableSplitUtil.buildQuerySql(column, table, where) + " limit
|
||||||
|
// 100";
|
||||||
String querySql = SingleTableSplitUtil.buildQuerySql(column, table, where) + " limit 100";
|
String querySql = SingleTableSplitUtil.buildQuerySql(column, table, where) + " limit 100";
|
||||||
|
|
||||||
return querySql;
|
return querySql;
|
||||||
@ -74,24 +75,24 @@ public class MaskingJob {
|
|||||||
public JsonPrimitive getMaskedData(String confContent) {
|
public JsonPrimitive getMaskedData(String confContent) {
|
||||||
init(confContent);
|
init(confContent);
|
||||||
return startRead();
|
return startRead();
|
||||||
//return new JsonPrimitive(getResult());
|
// return new JsonPrimitive(getResult());
|
||||||
}
|
}
|
||||||
|
|
||||||
public JsonPrimitive startRead() {
|
public JsonPrimitive startRead() {
|
||||||
String querySql = buildQuerySql();
|
String querySql = buildQuerySql();
|
||||||
System.out.println("startRead"+dataBaseType+jdbcUrl+username+password);
|
System.out.println("startRead" + dataBaseType + jdbcUrl + username + password);
|
||||||
Connection conn = DBUtil.getConnection(dataBaseType, jdbcUrl, username, password);
|
Connection conn = DBUtil.getConnection(dataBaseType, jdbcUrl, username, password);
|
||||||
System.out.println(dataBaseType+jdbcUrl+username+password);
|
System.out.println(dataBaseType + jdbcUrl + username + password);
|
||||||
int columnNumber = 0;
|
int columnNumber = 0;
|
||||||
String res="";
|
String res = "";
|
||||||
ArrayList<String>columnName=new ArrayList<>();
|
ArrayList<String> columnName = new ArrayList<>();
|
||||||
try {
|
try {
|
||||||
ResultSet rs = DBUtil.query(conn, querySql);
|
ResultSet rs = DBUtil.query(conn, querySql);
|
||||||
ResultSetMetaData metaData = rs.getMetaData();
|
ResultSetMetaData metaData = rs.getMetaData();
|
||||||
columnNumber = metaData.getColumnCount();
|
columnNumber = metaData.getColumnCount();
|
||||||
for(int i=1;i<=metaData.getColumnCount();i++){
|
for (int i = 1; i <= metaData.getColumnCount(); i++) {
|
||||||
//获取列表 index 从1开始、列名、列类型、列的数据长度
|
// 获取列表 index 从1开始、列名、列类型、列的数据长度
|
||||||
//System.out.println("aaa"+metaData.getColumnName(i)+"\t"+metaData.getColumnTypeName(i)+"\t"+metaData.getColumnDisplaySize(i));
|
// System.out.println("aaa"+metaData.getColumnName(i)+"\t"+metaData.getColumnTypeName(i)+"\t"+metaData.getColumnDisplaySize(i));
|
||||||
columnName.add(metaData.getColumnName(i));
|
columnName.add(metaData.getColumnName(i));
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -106,15 +107,14 @@ public class MaskingJob {
|
|||||||
} finally {
|
} finally {
|
||||||
DBUtil.closeDBResources(null, conn);
|
DBUtil.closeDBResources(null, conn);
|
||||||
}
|
}
|
||||||
////for(int i=0;i<columnNumber;i++){
|
//// for(int i=0;i<columnNumber;i++){
|
||||||
//columnName.add(metaData.getColumnName(i));
|
// columnName.add(metaData.getColumnName(i));
|
||||||
//}//
|
// }//
|
||||||
res=getResult(columnName);
|
res = getResult(columnName);
|
||||||
return new JsonPrimitive(res);
|
return new JsonPrimitive(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Record transportOneRecord(ResultSet rs, ResultSetMetaData metaData,
|
private Record transportOneRecord(ResultSet rs, ResultSetMetaData metaData, int columnNumber) {
|
||||||
int columnNumber) {
|
|
||||||
Record record = buildRecord(rs, metaData, columnNumber);
|
Record record = buildRecord(rs, metaData, columnNumber);
|
||||||
sendToWriter(record);
|
sendToWriter(record);
|
||||||
return record;
|
return record;
|
||||||
@ -133,32 +133,34 @@ public class MaskingJob {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Record doTransformer(Record record) {
|
private Record doTransformer(Record record) {
|
||||||
System.out.println("Record"+record);
|
System.out.println("Record" + record);
|
||||||
if (transformerExecs == null || transformerExecs.size() == 0) {
|
if (transformerExecs == null || transformerExecs.size() == 0) {
|
||||||
return record;
|
return record;
|
||||||
}
|
}
|
||||||
|
|
||||||
ClassLoaderSwapper classLoaderSwapper = ClassLoaderSwapper
|
ClassLoaderSwapper classLoaderSwapper =
|
||||||
.newCurrentThreadClassLoaderSwapper();
|
ClassLoaderSwapper.newCurrentThreadClassLoaderSwapper();
|
||||||
|
|
||||||
Record result = record;
|
Record result = record;
|
||||||
|
|
||||||
String errorMsg = null;
|
String errorMsg = null;
|
||||||
boolean failed = false;
|
boolean failed = false;
|
||||||
for (TransformerExecution transformerInfoExec : transformerExecs) {
|
for (TransformerExecution transformerInfoExec : transformerExecs) {
|
||||||
System.out.println("transformerExecs"+transformerInfoExec.getTransformerName());
|
System.out.println("transformerExecs" + transformerInfoExec.getTransformerName());
|
||||||
if (transformerInfoExec.getClassLoader() != null) {
|
if (transformerInfoExec.getClassLoader() != null) {
|
||||||
classLoaderSwapper.setCurrentThreadClassLoader(transformerInfoExec.getClassLoader());
|
classLoaderSwapper
|
||||||
|
.setCurrentThreadClassLoader(transformerInfoExec.getClassLoader());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 延迟检查transformer参数的有效性,直接抛出异常,不作为脏数据
|
* 延迟检查transformer参数的有效性,直接抛出异常,不作为脏数据 不需要在插件中检查参数的有效性。但参数的个数等和插件相关的参数,在插件内部检查
|
||||||
* 不需要在插件中检查参数的有效性。但参数的个数等和插件相关的参数,在插件内部检查
|
|
||||||
*/
|
*/
|
||||||
if (!transformerInfoExec.isChecked()) {
|
if (!transformerInfoExec.isChecked()) {
|
||||||
|
|
||||||
if (transformerInfoExec.getColumnIndex() != null && transformerInfoExec.getColumnIndex() >= record.getColumnNumber()) {
|
if (transformerInfoExec.getColumnIndex() != null
|
||||||
throw DataXException.asDataXException(TransformerErrorCode.TRANSFORMER_ILLEGAL_PARAMETER,
|
&& transformerInfoExec.getColumnIndex() >= record.getColumnNumber()) {
|
||||||
|
throw DataXException.asDataXException(
|
||||||
|
TransformerErrorCode.TRANSFORMER_ILLEGAL_PARAMETER,
|
||||||
String.format("columnIndex[%s] out of bound[%s]. name=%s",
|
String.format("columnIndex[%s] out of bound[%s]. name=%s",
|
||||||
transformerInfoExec.getColumnIndex(), record.getColumnNumber(),
|
transformerInfoExec.getColumnIndex(), record.getColumnNumber(),
|
||||||
transformerInfoExec.getTransformerName()));
|
transformerInfoExec.getTransformerName()));
|
||||||
@ -167,14 +169,15 @@ public class MaskingJob {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
result = transformerInfoExec.getTransformer().evaluate(result, transformerInfoExec.gettContext(), transformerInfoExec.getFinalParas());
|
result = transformerInfoExec.getTransformer().evaluate(result,
|
||||||
|
transformerInfoExec.gettContext(), transformerInfoExec.getFinalParas());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
errorMsg = String.format("transformer(%s) has Exception(%s)", transformerInfoExec.getTransformerName(),
|
errorMsg = String.format("transformer(%s) has Exception(%s)",
|
||||||
e.getMessage());
|
transformerInfoExec.getTransformerName(), e.getMessage());
|
||||||
failed = true;
|
failed = true;
|
||||||
//LOG.error(errorMsg, e);
|
// LOG.error(errorMsg, e);
|
||||||
// transformerInfoExec.addFailedRecords(1);
|
// transformerInfoExec.addFailedRecords(1);
|
||||||
//脏数据不再进行后续transformer处理,按脏数据处理,并过滤该record。
|
// 脏数据不再进行后续transformer处理,按脏数据处理,并过滤该record。
|
||||||
break;
|
break;
|
||||||
|
|
||||||
} finally {
|
} finally {
|
||||||
@ -193,14 +196,13 @@ public class MaskingJob {
|
|||||||
if (failed) {
|
if (failed) {
|
||||||
return null;
|
return null;
|
||||||
} else {
|
} else {
|
||||||
System.out.println("result"+result);
|
System.out.println("result" + result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Record buildRecord(ResultSet rs, ResultSetMetaData metaData,
|
protected Record buildRecord(ResultSet rs, ResultSetMetaData metaData, int columnNumber) {
|
||||||
int columnNumber) {
|
|
||||||
final byte[] EMPTY_CHAR_ARRAY = new byte[0];
|
final byte[] EMPTY_CHAR_ARRAY = new byte[0];
|
||||||
Record record = new DefaultRecord();
|
Record record = new DefaultRecord();
|
||||||
try {
|
try {
|
||||||
@ -276,13 +278,10 @@ public class MaskingJob {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw DataXException
|
throw DataXException.asDataXException(DBUtilErrorCode.UNSUPPORTED_TYPE,
|
||||||
.asDataXException(
|
|
||||||
DBUtilErrorCode.UNSUPPORTED_TYPE,
|
|
||||||
String.format(
|
String.format(
|
||||||
"您的配置文件中的列配置信息有误. 因为DataX 不支持数据库读取这种字段类型. 字段名:[%s], 字段名称:[%s], 字段Java类型:[%s]. 请尝试使用数据库函数将其转换datax支持的类型 或者不同步该字段 .",
|
"您的配置文件中的列配置信息有误. 因为DataX 不支持数据库读取这种字段类型. 字段名:[%s], 字段名称:[%s], 字段Java类型:[%s]. 请尝试使用数据库函数将其转换datax支持的类型 或者不同步该字段 .",
|
||||||
metaData.getColumnName(i),
|
metaData.getColumnName(i), metaData.getColumnType(i),
|
||||||
metaData.getColumnType(i),
|
|
||||||
metaData.getColumnClassName(i)));
|
metaData.getColumnClassName(i)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -294,33 +293,33 @@ public class MaskingJob {
|
|||||||
return record;
|
return record;
|
||||||
}
|
}
|
||||||
|
|
||||||
// private String recordToString(Record record) {
|
// private String recordToString(Record record) {
|
||||||
// final String NEWLINE_FLAG = "\n";
|
// final String NEWLINE_FLAG = "\n";
|
||||||
// String fieldDelimiter = "\t";
|
// String fieldDelimiter = "\t";
|
||||||
//
|
//
|
||||||
// int recordLength = record.getColumnNumber();
|
// int recordLength = record.getColumnNumber();
|
||||||
// if (0 == recordLength) {
|
// if (0 == recordLength) {
|
||||||
// return NEWLINE_FLAG;
|
// return NEWLINE_FLAG;
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// Column column;
|
// Column column;
|
||||||
// StringBuilder sb = new StringBuilder();
|
// StringBuilder sb = new StringBuilder();
|
||||||
// for (int i = 0; i < recordLength; i++) {
|
// for (int i = 0; i < recordLength; i++) {
|
||||||
// column = record.getColumn(i);
|
// column = record.getColumn(i);
|
||||||
// sb.append(column.asString()).append(fieldDelimiter);
|
// sb.append(column.asString()).append(fieldDelimiter);
|
||||||
// }
|
// }
|
||||||
// sb.setLength(sb.length() - 1);
|
// sb.setLength(sb.length() - 1);
|
||||||
// sb.append(NEWLINE_FLAG);
|
// sb.append(NEWLINE_FLAG);
|
||||||
//
|
//
|
||||||
// return sb.toString();
|
// return sb.toString();
|
||||||
// }
|
// }
|
||||||
|
|
||||||
public String getResult(ArrayList<String> columnName) {
|
public String getResult(ArrayList<String> columnName) {
|
||||||
List<Object> dataList = new ArrayList<>();
|
List<Object> dataList = new ArrayList<>();
|
||||||
int size = buffer.size();
|
int size = buffer.size();
|
||||||
//System.out.println("CCULUMN"+readerPara.getString(Key.COLUMN).toString());
|
// System.out.println("CCULUMN"+readerPara.getString(Key.COLUMN).toString());
|
||||||
//String[] colmnNames = readerPara.getString(Key.COLUMN).replace(" ", "").split(",");
|
// String[] colmnNames = readerPara.getString(Key.COLUMN).replace(" ", "").split(",");
|
||||||
int colmnSize= columnName.size();
|
int colmnSize = columnName.size();
|
||||||
for (int i = 0; i < colmnSize; ++i) {
|
for (int i = 0; i < colmnSize; ++i) {
|
||||||
Map<Object, Object> rowData = new HashMap<>();
|
Map<Object, Object> rowData = new HashMap<>();
|
||||||
for (int j = 0; j < size; ++j) {
|
for (int j = 0; j < size; ++j) {
|
||||||
|
@ -26,12 +26,14 @@ public class DebugMain {
|
|||||||
DebugConfig config = JsonUtil.fromJson(content, DebugConfig.class);
|
DebugConfig config = JsonUtil.fromJson(content, DebugConfig.class);
|
||||||
inject(config);
|
inject(config);
|
||||||
String keyPairStr = "{\"publicKey\":\"%s\",\"privateKey\":\"%s\"}";
|
String keyPairStr = "{\"publicKey\":\"%s\",\"privateKey\":\"%s\"}";
|
||||||
SM2KeyPair pair = SM2KeyPair.fromJson(String.format(keyPairStr, config.publicKey, config.privateKey));
|
SM2KeyPair pair =
|
||||||
|
SM2KeyPair.fromJson(String.format(keyPairStr, config.publicKey, config.privateKey));
|
||||||
String uriFormat = "ws://%s/SCIDE/SCExecutor";
|
String uriFormat = "ws://%s/SCIDE/SCExecutor";
|
||||||
if (config.killBeforeStart != null && config.killBeforeStart.length() > 0) {
|
if (config.killBeforeStart != null && config.killBeforeStart.length() > 0) {
|
||||||
AtomicInteger counter = new AtomicInteger(0);
|
AtomicInteger counter = new AtomicInteger(0);
|
||||||
|
|
||||||
SmartContractClient client = new SmartContractClient(String.format(uriFormat, config.agentAddress), pair) {
|
SmartContractClient client =
|
||||||
|
new SmartContractClient(String.format(uriFormat, config.agentAddress), pair) {
|
||||||
public void onLogin(JsonObject obj) {
|
public void onLogin(JsonObject obj) {
|
||||||
counter.incrementAndGet();
|
counter.incrementAndGet();
|
||||||
}
|
}
|
||||||
@ -44,23 +46,24 @@ public class DebugMain {
|
|||||||
client.waitForConnect();
|
client.waitForConnect();
|
||||||
client.login();
|
client.login();
|
||||||
try {
|
try {
|
||||||
for (; counter.get() == 0; )
|
for (; counter.get() == 0;)
|
||||||
Thread.sleep(100);
|
Thread.sleep(100);
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
client.sendMsg("{\"action\":\"killContractProcess\",\"name\":\"" + config.killBeforeStart + "\"}");
|
client.sendMsg("{\"action\":\"killContractProcess\",\"name\":\""
|
||||||
|
+ config.killBeforeStart + "\"}");
|
||||||
try {
|
try {
|
||||||
for (; counter.get() == 1; )
|
for (; counter.get() == 1;)
|
||||||
Thread.sleep(100);
|
Thread.sleep(100);
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
config.contract.setCreateParam(config.createParam);
|
config.contract.setCreateParam(config.createParam);
|
||||||
ContractProcess.main(new String[]{"-port=" + config.port, "-cmi=" + config.cmi, "-disablePID"});
|
ContractProcess
|
||||||
ResultCallback printCallback
|
.main(new String[] {"-port=" + config.port, "-cmi=" + config.cmi, "-disablePID"});
|
||||||
= new ResultCallback() {
|
ResultCallback printCallback = new ResultCallback() {
|
||||||
@Override
|
@Override
|
||||||
public void onResult(String str) {
|
public void onResult(String str) {
|
||||||
if (str.contains("Error")) {
|
if (str.contains("Error")) {
|
||||||
@ -70,16 +73,18 @@ public class DebugMain {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
ContractProcess.instance.handler.setDBInfo(wrap("", config.dbPath), printCallback);
|
ContractProcess.instance.handler.setDBInfo(wrap("", config.dbPath), printCallback);
|
||||||
ContractProcess.instance.handler.registerMangerPort(wrap("", Integer.valueOf(config.cPort)), printCallback);
|
ContractProcess.instance.handler.registerMangerPort(wrap("", Integer.valueOf(config.cPort)),
|
||||||
|
printCallback);
|
||||||
|
|
||||||
ContractProcess.instance.handler.setContractBundle(wrap("", config.contract), printCallback);
|
ContractProcess.instance.handler.setContractBundle(wrap("", config.contract),
|
||||||
|
printCallback);
|
||||||
|
|
||||||
String urlFormat = "http://%s/SCIDE/SCManager?action=reconnectPort&owner=%s&port=%d%s";
|
String urlFormat = "http://%s/SCIDE/SCManager?action=reconnectPort&owner=%s&port=%d%s";
|
||||||
String cpHost = "";
|
String cpHost = "";
|
||||||
if (config.cpHost != null && config.cpHost.length() > 0)
|
if (config.cpHost != null && config.cpHost.length() > 0)
|
||||||
cpHost = "&host=" + config.cpHost;
|
cpHost = "&host=" + config.cpHost;
|
||||||
String url = String.format(urlFormat, config.agentAddress,
|
String url = String.format(urlFormat, config.agentAddress, config.publicKey,
|
||||||
config.publicKey, ContractProcess.instance.server.mainPort.get(), cpHost);
|
ContractProcess.instance.server.mainPort.get(), cpHost);
|
||||||
Map<String, Object> resp = HttpUtil.httpGet(url);
|
Map<String, Object> resp = HttpUtil.httpGet(url);
|
||||||
|
|
||||||
String data = (String) resp.get("response");
|
String data = (String) resp.get("response");
|
||||||
@ -103,7 +108,8 @@ public class DebugMain {
|
|||||||
config.cPort = jsonObject.get("cPort").getAsInt();
|
config.cPort = jsonObject.get("cPort").getAsInt();
|
||||||
config.port = jsonObject.get("port").getAsInt();
|
config.port = jsonObject.get("port").getAsInt();
|
||||||
JsonObject ownerAndScript = new JsonObject();
|
JsonObject ownerAndScript = new JsonObject();
|
||||||
String arg = "abc&owner=" + config.publicKey + "&script=" + config.ypkPath + "&doipStartPort=" + config.doipStartPort;
|
String arg = "abc&owner=" + config.publicKey + "&script=" + config.ypkPath
|
||||||
|
+ "&doipStartPort=" + config.doipStartPort;
|
||||||
url = String.format(urlFormat, config.agentAddress, "allocateKeyPair", arg);
|
url = String.format(urlFormat, config.agentAddress, "allocateKeyPair", arg);
|
||||||
resp = HttpUtil.httpGet(url);
|
resp = HttpUtil.httpGet(url);
|
||||||
LOGGER.info(url);
|
LOGGER.info(url);
|
||||||
@ -134,7 +140,7 @@ public class DebugMain {
|
|||||||
String ypkPath;
|
String ypkPath;
|
||||||
String cpHost;
|
String cpHost;
|
||||||
int doipStartPort;
|
int doipStartPort;
|
||||||
//AutoAppend
|
// AutoAppend
|
||||||
int port;
|
int port;
|
||||||
String cmi;
|
String cmi;
|
||||||
String dbPath;
|
String dbPath;
|
||||||
|
@ -54,8 +54,8 @@ import java.util.*;
|
|||||||
import java.util.zip.ZipFile;
|
import java.util.zip.ZipFile;
|
||||||
|
|
||||||
public class ContractProcess {
|
public class ContractProcess {
|
||||||
private static final byte[] ZIP_HEADER_1 = new byte[]{80, 75, 3, 4};
|
private static final byte[] ZIP_HEADER_1 = new byte[] {80, 75, 3, 4};
|
||||||
private static final byte[] ZIP_HEADER_2 = new byte[]{80, 75, 5, 6};
|
private static final byte[] ZIP_HEADER_2 = new byte[] {80, 75, 5, 6};
|
||||||
private static final org.apache.logging.log4j.Logger LOGGER =
|
private static final org.apache.logging.log4j.Logger LOGGER =
|
||||||
org.apache.logging.log4j.LogManager.getLogger(ContractProcess.class);
|
org.apache.logging.log4j.LogManager.getLogger(ContractProcess.class);
|
||||||
public static ContractProcess instance;
|
public static ContractProcess instance;
|
||||||
@ -109,7 +109,7 @@ public class ContractProcess {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
Scanner sc = new Scanner(pidInput);
|
Scanner sc = new Scanner(pidInput);
|
||||||
for (String str; sc.hasNextLine(); ) {
|
for (String str; sc.hasNextLine();) {
|
||||||
str = sc.nextLine();
|
str = sc.nextLine();
|
||||||
LOGGER.info("[CP From STDIN] " + str);
|
LOGGER.info("[CP From STDIN] " + str);
|
||||||
if (str.contains("CP PID:")) {
|
if (str.contains("CP PID:")) {
|
||||||
@ -137,8 +137,7 @@ public class ContractProcess {
|
|||||||
byte[] buffer = new byte[4];
|
byte[] buffer = new byte[4];
|
||||||
int length = input.read(buffer, 0, 4);
|
int length = input.read(buffer, 0, 4);
|
||||||
if (length == 4) {
|
if (length == 4) {
|
||||||
isArchive =
|
isArchive = (Arrays.equals(ZIP_HEADER_1, buffer))
|
||||||
(Arrays.equals(ZIP_HEADER_1, buffer))
|
|
||||||
|| (Arrays.equals(ZIP_HEADER_2, buffer));
|
|| (Arrays.equals(ZIP_HEADER_2, buffer));
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
@ -194,9 +193,8 @@ public class ContractProcess {
|
|||||||
|
|
||||||
cn = czb.mergeContractNode();
|
cn = czb.mergeContractNode();
|
||||||
} else {
|
} else {
|
||||||
cn =
|
cn = compiler.compile(new ByteArrayInputStream(script.getBytes()),
|
||||||
compiler.compile(
|
"contract_main.yjs");
|
||||||
new ByteArrayInputStream(script.getBytes()), "contract_main.yjs");
|
|
||||||
}
|
}
|
||||||
DesktopEngine engine = new DesktopEngine(); // engine.loadJar(zf);
|
DesktopEngine engine = new DesktopEngine(); // engine.loadJar(zf);
|
||||||
engine.loadContract(c, cn, ret.isInsnLimit);
|
engine.loadContract(c, cn, ret.isInsnLimit);
|
||||||
@ -216,8 +214,8 @@ public class ContractProcess {
|
|||||||
|
|
||||||
MethodNode mn = methods.get(fn.functionName);
|
MethodNode mn = methods.get(fn.functionName);
|
||||||
if (mn != null) {
|
if (mn != null) {
|
||||||
System.out.println(
|
System.out
|
||||||
"[ContractManager] getMethodNode, verify:" + fn.functionName);
|
.println("[ContractManager] getMethodNode, verify:" + fn.functionName);
|
||||||
TaintResult.nLocals = mn.maxLocals;
|
TaintResult.nLocals = mn.maxLocals;
|
||||||
TaintResult.nStack = mn.maxStack;
|
TaintResult.nStack = mn.maxStack;
|
||||||
TaintCFG cfg = new TaintCFG(mn);
|
TaintCFG cfg = new TaintCFG(mn);
|
||||||
@ -278,17 +276,12 @@ public class ContractProcess {
|
|||||||
* CFGraph cfg = new CFGraph(mn) {
|
* CFGraph cfg = new CFGraph(mn) {
|
||||||
*
|
*
|
||||||
* @Override public BasicBlock getBasicBlock(int id) { return new
|
* @Override public BasicBlock getBasicBlock(int id) { return new
|
||||||
* BasicBlock(id); } }; FrontCF frontCF = new FrontCF(graph); String[]
|
* BasicBlock(id); } }; FrontCF frontCF = new FrontCF(graph); String[] data =
|
||||||
data =
|
* fn.plainText().split("\n"); for (int i = 0; i < graph.getBasicBlockSize();
|
||||||
* fn.plainText().split("\n"); for (int i = 0; i <
|
* i++) { BasicBlock bb = graph.getBasicBlockAt(i); String decompiled = ""; if
|
||||||
graph.getBasicBlockSize();
|
|
||||||
* i++) { BasicBlock bb = graph.getBasicBlockAt(i); String decompiled =
|
|
||||||
""; if
|
|
||||||
* (bb.lineNum - 1 < data.length && bb.lineNum > 0) { decompiled =
|
* (bb.lineNum - 1 < data.length && bb.lineNum > 0) { decompiled =
|
||||||
* data[bb.lineNum - 1]; } frontCF.addBB(bb, decompiled); Set<BasicBlock>
|
* data[bb.lineNum - 1]; } frontCF.addBB(bb, decompiled); Set<BasicBlock> suc =
|
||||||
suc =
|
* graph.getSucBlocks(bb); for (BasicBlock sucBB : suc) frontCF.addEdge(bb,
|
||||||
* graph.getSucBlocks(bb); for (BasicBlock sucBB : suc)
|
|
||||||
frontCF.addEdge(bb,
|
|
||||||
* sucBB); }
|
* sucBB); }
|
||||||
*/
|
*/
|
||||||
TaintResult.nLocals = mn.maxLocals;
|
TaintResult.nLocals = mn.maxLocals;
|
||||||
@ -311,7 +304,8 @@ public class ContractProcess {
|
|||||||
List<Integer> ids = map.get(i);
|
List<Integer> ids = map.get(i);
|
||||||
frontCF.addBB(bb, decompiled, ids, cfg);
|
frontCF.addBB(bb, decompiled, ids, cfg);
|
||||||
Set<BasicBlock> suc = cfg.getSucBlocks(bb);
|
Set<BasicBlock> suc = cfg.getSucBlocks(bb);
|
||||||
for (BasicBlock sucBB : suc) frontCF.addEdge(bb, sucBB);
|
for (BasicBlock sucBB : suc)
|
||||||
|
frontCF.addEdge(bb, sucBB);
|
||||||
}
|
}
|
||||||
// get result
|
// get result
|
||||||
// TaintBB lastBlock = cfg.getLastBlock();
|
// TaintBB lastBlock = cfg.getLastBlock();
|
||||||
@ -404,10 +398,8 @@ public class ContractProcess {
|
|||||||
String yancloud_desktop = "";
|
String yancloud_desktop = "";
|
||||||
isOpen.put(pmList[0], pmList[1]);
|
isOpen.put(pmList[0], pmList[1]);
|
||||||
yancloud_desktop += UtilRegistry.getInitStr(pmList[0], pmList[1].equals("open"));
|
yancloud_desktop += UtilRegistry.getInitStr(pmList[0], pmList[1].equals("open"));
|
||||||
engine.getNashornEngine()
|
engine.getNashornEngine().getContext().setAttribute(ScriptEngine.FILENAME,
|
||||||
.getContext()
|
yancloud_desktop, ScriptContext.ENGINE_SCOPE);
|
||||||
.setAttribute(
|
|
||||||
ScriptEngine.FILENAME, yancloud_desktop, ScriptContext.ENGINE_SCOPE);
|
|
||||||
engine.getNashornEngine().eval(yancloud_desktop);
|
engine.getNashornEngine().eval(yancloud_desktop);
|
||||||
} catch (ScriptException e) {
|
} catch (ScriptException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@ -429,24 +421,19 @@ public class ContractProcess {
|
|||||||
// 判断是否满足Oracle和Contact的执行要求
|
// 判断是否满足Oracle和Contact的执行要求
|
||||||
public String verifyOracleAndContractPermission(Contract contract) {
|
public String verifyOracleAndContractPermission(Contract contract) {
|
||||||
// 权限校验 如果是Oracle 启动方式只能是Sole 否则报错
|
// 权限校验 如果是Oracle 启动方式只能是Sole 否则报错
|
||||||
if (cn.getYjsType() == YjsType.Oracle && contract.getType() != ContractExecType.Sole && contract.getType() != ContractExecType.Sharding) {
|
if (cn.getYjsType() == YjsType.Oracle && contract.getType() != ContractExecType.Sole
|
||||||
|
&& contract.getType() != ContractExecType.Sharding) {
|
||||||
LOGGER.info("Oracle only support Sole ContractType!");
|
LOGGER.info("Oracle only support Sole ContractType!");
|
||||||
return JsonUtil.toJson(
|
return JsonUtil.toJson(new ContractResult(Status.Error,
|
||||||
new ContractResult(
|
|
||||||
Status.Error,
|
|
||||||
new JsonPrimitive("Oracle only support Sole ContractType!")));
|
new JsonPrimitive("Oracle only support Sole ContractType!")));
|
||||||
}
|
}
|
||||||
// 权限校验 如果是contract 申请了MySQL等权限 报错
|
// 权限校验 如果是contract 申请了MySQL等权限 报错
|
||||||
if (cn.getYjsType() == YjsType.Contract) {
|
if (cn.getYjsType() == YjsType.Contract) {
|
||||||
for (Permission per : cn.getPermission()) {
|
for (Permission per : cn.getPermission()) {
|
||||||
if (per == Permission.SQL
|
if (per == Permission.SQL || per == Permission.Http || per == Permission.RocksDB
|
||||||
|| per == Permission.Http
|
|
||||||
|| per == Permission.RocksDB
|
|
||||||
|| per == Permission.MongoDB) {
|
|| per == Permission.MongoDB) {
|
||||||
LOGGER.debug("Contract can not have permissions of IO!");
|
LOGGER.debug("Contract can not have permissions of IO!");
|
||||||
return JsonUtil.toJson(
|
return JsonUtil.toJson(new ContractResult(Status.Error,
|
||||||
new ContractResult(
|
|
||||||
Status.Error,
|
|
||||||
new JsonPrimitive("Contract can not have permissions of IO|")));
|
new JsonPrimitive("Contract can not have permissions of IO|")));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -458,7 +445,8 @@ public class ContractProcess {
|
|||||||
JavaScriptEntry.members = members;
|
JavaScriptEntry.members = members;
|
||||||
if (members != null)
|
if (members != null)
|
||||||
return members.size() + "";
|
return members.size() + "";
|
||||||
else return "0";
|
else
|
||||||
|
return "0";
|
||||||
}
|
}
|
||||||
|
|
||||||
public String setContractBundle(Contract contract) {
|
public String setContractBundle(Contract contract) {
|
||||||
@ -470,11 +458,10 @@ public class ContractProcess {
|
|||||||
JavaScriptEntry.invokeID = 0L;
|
JavaScriptEntry.invokeID = 0L;
|
||||||
JavaScriptEntry.random.setSeed(Integer.parseInt(contract.getID()));
|
JavaScriptEntry.random.setSeed(Integer.parseInt(contract.getID()));
|
||||||
JavaScriptEntry.numOfCopies = this.contract.getNumOfCopies();
|
JavaScriptEntry.numOfCopies = this.contract.getNumOfCopies();
|
||||||
JavaScriptEntry.shardingID =
|
JavaScriptEntry.shardingID = this.contract.getShardingId(); // 设置javaScriptEntry中的shardingID
|
||||||
this.contract.getShardingId(); // 设置javaScriptEntry中的shardingID
|
|
||||||
// JavaScriptEntry
|
// JavaScriptEntry
|
||||||
// contract.getCreateParam().get("repoId").getAsString()-->去获取repoId。
|
// contract.getCreateParam().get("repoId").getAsString()-->去获取repoId。
|
||||||
//知道自己的BDOID --> repo的id。+contract.getID()
|
// 知道自己的BDOID --> repo的id。+contract.getID()
|
||||||
String zipPath = contract.getScriptStr();
|
String zipPath = contract.getScriptStr();
|
||||||
if (isArchiveFile(new File(zipPath))) {
|
if (isArchiveFile(new File(zipPath))) {
|
||||||
ZipFile zf = new ZipFile(zipPath);
|
ZipFile zf = new ZipFile(zipPath);
|
||||||
@ -487,17 +474,14 @@ public class ContractProcess {
|
|||||||
memorySet = cn.memorySet;
|
memorySet = cn.memorySet;
|
||||||
this.contract.sourcePath = zipBundle.getManifest().sourcePath;
|
this.contract.sourcePath = zipBundle.getManifest().sourcePath;
|
||||||
|
|
||||||
LOGGER.debug(
|
LOGGER.debug("check sourcePath\n\tin-contract=" + this.contract.sourcePath
|
||||||
"check sourcePath\n\tin-contract="
|
+ "\n\tin-manifest=" + zipBundle.getManifest().sourcePath);
|
||||||
+ this.contract.sourcePath
|
|
||||||
+ "\n\tin-manifest="
|
|
||||||
+ zipBundle.getManifest().sourcePath);
|
|
||||||
// zhanghongwei
|
// zhanghongwei
|
||||||
|
|
||||||
/* if (ret.getManifest().getInsnLimit() != 0) {
|
/*
|
||||||
gasLimit=ret.getManifest().getInsnLimit();
|
* if (ret.getManifest().getInsnLimit() != 0) {
|
||||||
isInsnLimit = true;
|
* gasLimit=ret.getManifest().getInsnLimit(); isInsnLimit = true; }
|
||||||
}*/
|
*/
|
||||||
String ver = verifyOracleAndContractPermission(contract);
|
String ver = verifyOracleAndContractPermission(contract);
|
||||||
if (!ver.isEmpty()) {
|
if (!ver.isEmpty()) {
|
||||||
return ver;
|
return ver;
|
||||||
@ -533,15 +517,13 @@ public class ContractProcess {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} catch (MalformedJsonException | JsonSyntaxException e) {
|
} catch (MalformedJsonException | JsonSyntaxException e) {
|
||||||
return JsonUtil.toJson(
|
return JsonUtil.toJson(new ContractResult(Status.Error,
|
||||||
new ContractResult(
|
|
||||||
Status.Error,
|
|
||||||
new JsonPrimitive("parse manifest.json error, not json format!")));
|
new JsonPrimitive("parse manifest.json error, not json format!")));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
ByteArrayOutputStream bo = new ByteArrayOutputStream();
|
ByteArrayOutputStream bo = new ByteArrayOutputStream();
|
||||||
e.printStackTrace(new PrintStream(bo));
|
e.printStackTrace(new PrintStream(bo));
|
||||||
return JsonUtil.toJson(
|
return JsonUtil
|
||||||
new ContractResult(Status.Error, new JsonPrimitive(bo.toString())));
|
.toJson(new ContractResult(Status.Error, new JsonPrimitive(bo.toString())));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -572,13 +554,14 @@ public class ContractProcess {
|
|||||||
|
|
||||||
|
|
||||||
if (fun.isExport()) {
|
if (fun.isExport()) {
|
||||||
//if(fun.annotations...)
|
// if(fun.annotations...)
|
||||||
AccessHandler accessHandler = createHandlerIfExist(fun, AccessHandler.class);
|
AccessHandler accessHandler = createHandlerIfExist(fun, AccessHandler.class);
|
||||||
if (accessHandler != null) {
|
if (accessHandler != null) {
|
||||||
fun.appendBeforeInvokeHandler(accessHandler);
|
fun.appendBeforeInvokeHandler(accessHandler);
|
||||||
}
|
}
|
||||||
fun.appendAfterInvokeHandler(new ObjToJsonHandler());
|
fun.appendAfterInvokeHandler(new ObjToJsonHandler());
|
||||||
ResultSchemaHandler resultSchemaHandler = createHandlerIfExist(fun, ResultSchemaHandler.class);
|
ResultSchemaHandler resultSchemaHandler =
|
||||||
|
createHandlerIfExist(fun, ResultSchemaHandler.class);
|
||||||
if (resultSchemaHandler != null) {
|
if (resultSchemaHandler != null) {
|
||||||
fun.appendAfterInvokeHandler(resultSchemaHandler);
|
fun.appendAfterInvokeHandler(resultSchemaHandler);
|
||||||
}
|
}
|
||||||
@ -605,8 +588,10 @@ public class ContractProcess {
|
|||||||
if (doopRequestHandler == null) {
|
if (doopRequestHandler == null) {
|
||||||
doopRequestHandler = new DOOPRequestHandler();
|
doopRequestHandler = new DOOPRequestHandler();
|
||||||
}
|
}
|
||||||
fun.appendBeforeInvokeHandler(new DOOPBeforeExecHandler(fun.getDoipOperationInfo().operation));
|
fun.appendBeforeInvokeHandler(
|
||||||
fun.appendAfterInvokeHandler(new DOOPAfterExecHandler(fun.getDoipOperationInfo().operation));
|
new DOOPBeforeExecHandler(fun.getDoipOperationInfo().operation));
|
||||||
|
fun.appendAfterInvokeHandler(
|
||||||
|
new DOOPAfterExecHandler(fun.getDoipOperationInfo().operation));
|
||||||
doopRequestHandler.addDoipOperation(fun);
|
doopRequestHandler.addDoipOperation(fun);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -614,11 +599,14 @@ public class ContractProcess {
|
|||||||
|
|
||||||
<T extends AnnotationHook> T createHandlerIfExist(FunctionNode function, Class<T> clz) {
|
<T extends AnnotationHook> T createHandlerIfExist(FunctionNode function, Class<T> clz) {
|
||||||
YJSAnnotation annotation = clz.getAnnotation(YJSAnnotation.class);
|
YJSAnnotation annotation = clz.getAnnotation(YJSAnnotation.class);
|
||||||
if (annotation == null) return null;
|
if (annotation == null)
|
||||||
|
return null;
|
||||||
try {
|
try {
|
||||||
AnnotationNode node = function.getAnnotation(annotation.name());
|
AnnotationNode node = function.getAnnotation(annotation.name());
|
||||||
if (node == null) return null;
|
if (node == null)
|
||||||
Method m = clz.getDeclaredMethod("fromAnnotationNode", FunctionNode.class, AnnotationNode.class);
|
return null;
|
||||||
|
Method m = clz.getDeclaredMethod("fromAnnotationNode", FunctionNode.class,
|
||||||
|
AnnotationNode.class);
|
||||||
T result = (T) m.invoke(null, function, node);
|
T result = (T) m.invoke(null, function, node);
|
||||||
return result;
|
return result;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@ -660,8 +648,7 @@ public class ContractProcess {
|
|||||||
handleLog();
|
handleLog();
|
||||||
LOGGER.info("load script, contract:" + JsonUtil.toJson(contract.getScriptStr()));
|
LOGGER.info("load script, contract:" + JsonUtil.toJson(contract.getScriptStr()));
|
||||||
LOGGER.info("load cn:" + JsonUtil.toJson(cn));
|
LOGGER.info("load cn:" + JsonUtil.toJson(cn));
|
||||||
ContractResult ret =
|
ContractResult ret = engine.loadContract(contract, cn, cn.getInstrumentBranch());
|
||||||
engine.loadContract(contract, cn, cn.getInstrumentBranch());
|
|
||||||
ContractResult onCreate = invokeOnCreate(contract.getCreateParam());
|
ContractResult onCreate = invokeOnCreate(contract.getCreateParam());
|
||||||
JsonObject jo = new JsonObject();
|
JsonObject jo = new JsonObject();
|
||||||
jo.add("onCreate", JsonUtil.parseObject(onCreate));
|
jo.add("onCreate", JsonUtil.parseObject(onCreate));
|
||||||
@ -679,14 +666,14 @@ public class ContractProcess {
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
ByteArrayOutputStream bo = new ByteArrayOutputStream();
|
ByteArrayOutputStream bo = new ByteArrayOutputStream();
|
||||||
e.printStackTrace(new PrintStream(bo));
|
e.printStackTrace(new PrintStream(bo));
|
||||||
return JsonUtil.toJson(
|
return JsonUtil
|
||||||
new ContractResult(Status.Error, new JsonPrimitive(bo.toString())));
|
.toJson(new ContractResult(Status.Error, new JsonPrimitive(bo.toString())));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateRepoInfo(JsonElement arg) throws Exception {
|
public void updateRepoInfo(JsonElement arg) throws Exception {
|
||||||
// 只有0号节点需要初始化IRP连接去updateRepoInfo
|
// 只有0号节点需要初始化IRP连接去updateRepoInfo
|
||||||
//just disable this part
|
// just disable this part
|
||||||
if (JavaScriptEntry.shardingID == -1) {
|
if (JavaScriptEntry.shardingID == -1) {
|
||||||
// DOOP relevant logic
|
// DOOP relevant logic
|
||||||
DoipClusterServer server = DoipClusterServer.getDOOPServerInstance();
|
DoipClusterServer server = DoipClusterServer.getDOOPServerInstance();
|
||||||
@ -695,9 +682,11 @@ public class ContractProcess {
|
|||||||
if (createParams.has("router")) {
|
if (createParams.has("router")) {
|
||||||
JsonElement routerInfo = createParams.get("router");
|
JsonElement routerInfo = createParams.get("router");
|
||||||
if (!routerInfo.isJsonObject())
|
if (!routerInfo.isJsonObject())
|
||||||
throw new Exception("Provide wrong router info in create params to DoipModule");
|
throw new Exception(
|
||||||
|
"Provide wrong router info in create params to DoipModule");
|
||||||
else {
|
else {
|
||||||
EndpointConfig endpointConfig = JsonUtil.GSON.fromJson(routerInfo.getAsJsonObject(), EndpointConfig.class);
|
EndpointConfig endpointConfig = JsonUtil.GSON
|
||||||
|
.fromJson(routerInfo.getAsJsonObject(), EndpointConfig.class);
|
||||||
DoipClusterServer.createDOOPServerInstance(endpointConfig);
|
DoipClusterServer.createDOOPServerInstance(endpointConfig);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -712,17 +701,20 @@ public class ContractProcess {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void invokeOnStartingDoipServer(ContractNode cn, JsonElement arg, JsonObject returnValue) {
|
public void invokeOnStartingDoipServer(ContractNode cn, JsonElement arg,
|
||||||
|
JsonObject returnValue) {
|
||||||
ContractRequest onStartingDoipServer = new ContractRequest();
|
ContractRequest onStartingDoipServer = new ContractRequest();
|
||||||
onStartingDoipServer.setAction("onServerStart");
|
onStartingDoipServer.setAction("onServerStart");
|
||||||
if (arg == null) {
|
if (arg == null) {
|
||||||
if (engine != null && engine.getManifest() != null && engine.getManifest().createParam != null)
|
if (engine != null && engine.getManifest() != null
|
||||||
|
&& engine.getManifest().createParam != null)
|
||||||
arg = engine.getManifest().createParam;
|
arg = engine.getManifest().createParam;
|
||||||
else
|
else
|
||||||
arg = new JsonPrimitive("");
|
arg = new JsonPrimitive("");
|
||||||
}
|
}
|
||||||
onStartingDoipServer.setArg(arg);
|
onStartingDoipServer.setArg(arg);
|
||||||
LOGGER.debug("invoke onStartingDoipServer, param:" + onStartingDoipServer.getArg().toString());
|
LOGGER.debug(
|
||||||
|
"invoke onStartingDoipServer, param:" + onStartingDoipServer.getArg().toString());
|
||||||
onStartingDoipServer.setRequester(contract.getOwner());
|
onStartingDoipServer.setRequester(contract.getOwner());
|
||||||
FunctionNode funNode = cn.getFunction("onServerStart");
|
FunctionNode funNode = cn.getFunction("onServerStart");
|
||||||
|
|
||||||
@ -733,13 +725,16 @@ public class ContractProcess {
|
|||||||
if (arg.isJsonObject() && arg.getAsJsonObject().has("doipStartPort")) {
|
if (arg.isJsonObject() && arg.getAsJsonObject().has("doipStartPort")) {
|
||||||
startPort = arg.getAsJsonObject().get("doipStartPort").getAsInt();
|
startPort = arg.getAsJsonObject().get("doipStartPort").getAsInt();
|
||||||
}
|
}
|
||||||
LOGGER.info("Fetch the onStartingDoipServerRes from router successfully, the result is " + onStartingDoipServerRes);
|
LOGGER.info("Fetch the onStartingDoipServerRes from router successfully, the result is "
|
||||||
int doipListenPort = DoipClusterServer.startDoipServer(startPort, onStartingDoipServerRes);
|
+ onStartingDoipServerRes);
|
||||||
|
int doipListenPort =
|
||||||
|
DoipClusterServer.startDoipServer(startPort, onStartingDoipServerRes);
|
||||||
returnValue.addProperty("doipListenPort", doipListenPort);
|
returnValue.addProperty("doipListenPort", doipListenPort);
|
||||||
this.contract.setDoipPort(doipListenPort);
|
this.contract.setDoipPort(doipListenPort);
|
||||||
returnValue.addProperty("doipStartPort", startPort);
|
returnValue.addProperty("doipStartPort", startPort);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
LOGGER.error("DoipLocalSingleton cannot starts properly, plz check the onServerStart function");
|
LOGGER.error(
|
||||||
|
"DoipLocalSingleton cannot starts properly, plz check the onServerStart function");
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
funNode = cn.getFunction("onInitSharableVars");
|
funNode = cn.getFunction("onInitSharableVars");
|
||||||
@ -774,7 +769,8 @@ public class ContractProcess {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fun.getLogToBDContract()) detail.append("bdcontract;");
|
if (fun.getLogToBDContract())
|
||||||
|
detail.append("bdcontract;");
|
||||||
if (fun.getLogToNamedLedger()) {
|
if (fun.getLogToNamedLedger()) {
|
||||||
for (String str : fun.getLedgerNames()) {
|
for (String str : fun.getLedgerNames()) {
|
||||||
detail.append("bdledger:").append(str).append(";");
|
detail.append("bdledger:").append(str).append(";");
|
||||||
@ -820,7 +816,8 @@ public class ContractProcess {
|
|||||||
ContractRequest onCreate = new ContractRequest();
|
ContractRequest onCreate = new ContractRequest();
|
||||||
onCreate.setAction("onCreate");
|
onCreate.setAction("onCreate");
|
||||||
if (arg == null) {
|
if (arg == null) {
|
||||||
if (engine != null && engine.getManifest() != null && engine.getManifest().createParam != null)
|
if (engine != null && engine.getManifest() != null
|
||||||
|
&& engine.getManifest().createParam != null)
|
||||||
arg = engine.getManifest().createParam;
|
arg = engine.getManifest().createParam;
|
||||||
else
|
else
|
||||||
arg = new JsonPrimitive("");
|
arg = new JsonPrimitive("");
|
||||||
@ -893,8 +890,7 @@ public class ContractProcess {
|
|||||||
List<Long> hashes = logIndex.request(offset, size);
|
List<Long> hashes = logIndex.request(offset, size);
|
||||||
List<Map<String, String>> jo = new ArrayList<>();
|
List<Map<String, String>> jo = new ArrayList<>();
|
||||||
|
|
||||||
TypeToken<Map<String, String>> token = new TypeToken<Map<String, String>>() {
|
TypeToken<Map<String, String>> token = new TypeToken<Map<String, String>>() {};
|
||||||
};
|
|
||||||
for (Long hash : hashes)
|
for (Long hash : hashes)
|
||||||
try {
|
try {
|
||||||
Map<String, String> obj =
|
Map<String, String> obj =
|
||||||
@ -909,8 +905,7 @@ public class ContractProcess {
|
|||||||
public String requestLast(int count) {
|
public String requestLast(int count) {
|
||||||
List<Long> hashes = logIndex.requestLast(count);
|
List<Long> hashes = logIndex.requestLast(count);
|
||||||
List<Map<String, String>> jo = new ArrayList<>();
|
List<Map<String, String>> jo = new ArrayList<>();
|
||||||
TypeToken<Map<String, String>> token = new TypeToken<Map<String, String>>() {
|
TypeToken<Map<String, String>> token = new TypeToken<Map<String, String>>() {};
|
||||||
};
|
|
||||||
String log;
|
String log;
|
||||||
for (Long hash : hashes)
|
for (Long hash : hashes)
|
||||||
try {
|
try {
|
||||||
@ -920,8 +915,8 @@ public class ContractProcess {
|
|||||||
}
|
}
|
||||||
Map<String, String> obj = JsonUtil.fromJson(log, token.getType());
|
Map<String, String> obj = JsonUtil.fromJson(log, token.getType());
|
||||||
if (obj == null) {
|
if (obj == null) {
|
||||||
System.out.println(
|
System.out
|
||||||
"[ContractProcess] requestLast, parseJsonError:" + log + "==");
|
.println("[ContractProcess] requestLast, parseJsonError:" + log + "==");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
obj.put("hash", hash + "");
|
obj.put("hash", hash + "");
|
||||||
@ -964,9 +959,8 @@ public class ContractProcess {
|
|||||||
try {
|
try {
|
||||||
request = JsonUtil.fromJson(arg, ContractRequest.class);
|
request = JsonUtil.fromJson(arg, ContractRequest.class);
|
||||||
} catch (Exception ignored) {
|
} catch (Exception ignored) {
|
||||||
result =
|
result = new ContractResult(ContractResult.Status.Error,
|
||||||
new ContractResult(
|
new JsonPrimitive("Illegal Arguments!"));
|
||||||
ContractResult.Status.Error, new JsonPrimitive("Illegal Arguments!"));
|
|
||||||
return JsonUtil.toJson(result);
|
return JsonUtil.toJson(result);
|
||||||
}
|
}
|
||||||
String reqID = request.getRequestID();
|
String reqID = request.getRequestID();
|
||||||
@ -987,9 +981,9 @@ public class ContractProcess {
|
|||||||
engine.redirectTracePS(new Logger(bo, this));
|
engine.redirectTracePS(new Logger(bo, this));
|
||||||
result = engine.executeContract(request);
|
result = engine.executeContract(request);
|
||||||
result.analysis = bo.toString();
|
result.analysis = bo.toString();
|
||||||
System.out.println(
|
System.out.println("[ContractProcess] result.analysis = " + result.analysis); // 动态分析bug
|
||||||
"[ContractProcess] result.analysis = "
|
// null
|
||||||
+ result.analysis); // 动态分析bug null pointer
|
// pointer
|
||||||
// branchResult = JsonUtil.toJson(result);
|
// branchResult = JsonUtil.toJson(result);
|
||||||
// branchTrace = result.analysis;
|
// branchTrace = result.analysis;
|
||||||
engine.redirectTracePS(previous);
|
engine.redirectTracePS(previous);
|
||||||
@ -1008,16 +1002,8 @@ public class ContractProcess {
|
|||||||
evaluatesAnalysis(request.getAction());
|
evaluatesAnalysis(request.getAction());
|
||||||
}
|
}
|
||||||
|
|
||||||
engine.redirectTracePS(
|
engine.redirectTracePS(new ProgramPointCounter(bo, this, gasLimit, functionIndex,
|
||||||
new ProgramPointCounter(
|
request.getValue(), 0L, request.getAction(), ppCountMap));
|
||||||
bo,
|
|
||||||
this,
|
|
||||||
gasLimit,
|
|
||||||
functionIndex,
|
|
||||||
request.getValue(),
|
|
||||||
0L,
|
|
||||||
request.getAction(),
|
|
||||||
ppCountMap));
|
|
||||||
result = engine.executeContract(request);
|
result = engine.executeContract(request);
|
||||||
|
|
||||||
result.analysis = bo.toString();
|
result.analysis = bo.toString();
|
||||||
@ -1058,8 +1044,7 @@ public class ContractProcess {
|
|||||||
for (String s : function) {
|
for (String s : function) {
|
||||||
MethodNode mn = methods.get(s);
|
MethodNode mn = methods.get(s);
|
||||||
if (mn != null) {
|
if (mn != null) {
|
||||||
CFGraph cfg =
|
CFGraph cfg = new CFGraph(mn) {
|
||||||
new CFGraph(mn) {
|
|
||||||
@Override
|
@Override
|
||||||
public BasicBlock getBasicBlock(int id) {
|
public BasicBlock getBasicBlock(int id) {
|
||||||
return new BasicBlock(id);
|
return new BasicBlock(id);
|
||||||
@ -1126,10 +1111,7 @@ public class ContractProcess {
|
|||||||
|
|
||||||
TaintBB bb = cfg.getLastBlock();
|
TaintBB bb = cfg.getLastBlock();
|
||||||
result.analysis = bb.getResultWithTaintBit();
|
result.analysis = bb.getResultWithTaintBit();
|
||||||
System.out.println(
|
System.out.println("[ContractProcess] dynamically verify: " + ac.getAction() + "-->"
|
||||||
"[ContractProcess] dynamically verify: "
|
|
||||||
+ ac.getAction()
|
|
||||||
+ "-->"
|
|
||||||
+ result.analysis);
|
+ result.analysis);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1152,8 +1134,7 @@ public class ContractProcess {
|
|||||||
return !JavaScriptEntry.topic_handlers.isEmpty();
|
return !JavaScriptEntry.topic_handlers.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void beforeSuicide() {
|
public void beforeSuicide() {}
|
||||||
}
|
|
||||||
|
|
||||||
public String redo(String path) {
|
public String redo(String path) {
|
||||||
return engine.syncUtil.redo(path);
|
return engine.syncUtil.redo(path);
|
||||||
@ -1208,8 +1189,7 @@ public class ContractProcess {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void finalize() {
|
protected void finalize() {}
|
||||||
}
|
|
||||||
|
|
||||||
public String getDeclaredEvents() {
|
public String getDeclaredEvents() {
|
||||||
return JsonUtil.toJson(cn.events);
|
return JsonUtil.toJson(cn.events);
|
||||||
@ -1224,8 +1204,8 @@ public class ContractProcess {
|
|||||||
for (FunctionNode fn : cn.getFunctions()) {
|
for (FunctionNode fn : cn.getFunctions()) {
|
||||||
if (fn.isExport() && !fn.functionName.equals("onCreate")) {
|
if (fn.isExport() && !fn.functionName.equals("onCreate")) {
|
||||||
function.add(fn.functionName);
|
function.add(fn.functionName);
|
||||||
FunctionDesp desp =
|
FunctionDesp desp = new FunctionDesp(fn.functionName, fn.annotations,
|
||||||
new FunctionDesp(fn.functionName, fn.annotations, fn.getRouteInfo(), fn.getJoinInfo(), fn.isView());
|
fn.getRouteInfo(), fn.getJoinInfo(), fn.isView());
|
||||||
ret.add(desp);
|
ret.add(desp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1246,11 +1226,8 @@ public class ContractProcess {
|
|||||||
|
|
||||||
public String startAutoDump() {
|
public String startAutoDump() {
|
||||||
String dumpPeriod = projectConfig.getDumpPeriod();
|
String dumpPeriod = projectConfig.getDumpPeriod();
|
||||||
System.out.println(
|
System.out.println("[ContractProcess] startAutoDump : " + cn.getContractName()
|
||||||
"[ContractProcess] startAutoDump : "
|
+ " period = " + dumpPeriod);
|
||||||
+ cn.getContractName()
|
|
||||||
+ " period = "
|
|
||||||
+ dumpPeriod);
|
|
||||||
String status = "startAutoDump status 0";
|
String status = "startAutoDump status 0";
|
||||||
if (null != dt) {
|
if (null != dt) {
|
||||||
if (null == dumpPeriod || dumpPeriod.isEmpty()) {
|
if (null == dumpPeriod || dumpPeriod.isEmpty()) {
|
||||||
@ -1431,8 +1408,7 @@ public class ContractProcess {
|
|||||||
private class DumpTask extends TimerTask {
|
private class DumpTask extends TimerTask {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
System.out.println(
|
System.out.println("[ContractProcess DumpTask] auto dump period : "
|
||||||
"[ContractProcess DumpTask] auto dump period : "
|
|
||||||
+ projectConfig.getDumpPeriod());
|
+ projectConfig.getDumpPeriod());
|
||||||
File file1 = new File(dir);
|
File file1 = new File(dir);
|
||||||
File file2 = new File(file1.getParent());
|
File file2 = new File(file1.getParent());
|
||||||
|
@ -31,11 +31,13 @@ public class SM2Helper {
|
|||||||
backupFile(new File("./cmconfig.json"));
|
backupFile(new File("./cmconfig.json"));
|
||||||
System.out.println("Generate file: cmconfig.json");
|
System.out.println("Generate file: cmconfig.json");
|
||||||
String content = FileUtil.getFileContent("./cmconfig.json.template");
|
String content = FileUtil.getFileContent("./cmconfig.json.template");
|
||||||
JsonObject jo = JsonParser.parseReader(new FileReader("cmvar.json")).getAsJsonObject();
|
JsonObject jo =
|
||||||
|
JsonParser.parseReader(new FileReader("cmvar.json")).getAsJsonObject();
|
||||||
for (String key : jo.keySet()) {
|
for (String key : jo.keySet()) {
|
||||||
content = content.replaceAll(key, jo.get(key).getAsString());
|
content = content.replaceAll(key, jo.get(key).getAsString());
|
||||||
}
|
}
|
||||||
JsonObject keypair = JsonParser.parseReader(new FileReader("manager.keypair")).getAsJsonObject();
|
JsonObject keypair =
|
||||||
|
JsonParser.parseReader(new FileReader("manager.keypair")).getAsJsonObject();
|
||||||
content = content.replaceAll("_PRIVKEY", keypair.get("privateKey").getAsString());
|
content = content.replaceAll("_PRIVKEY", keypair.get("privateKey").getAsString());
|
||||||
content = content.replaceAll("_PUBKEY", keypair.get("publicKey").getAsString());
|
content = content.replaceAll("_PUBKEY", keypair.get("publicKey").getAsString());
|
||||||
content = content.replaceAll("CMI", System.currentTimeMillis() + "");
|
content = content.replaceAll("CMI", System.currentTimeMillis() + "");
|
||||||
@ -58,15 +60,18 @@ public class SM2Helper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static void backupFile(File file) {
|
private static void backupFile(File file) {
|
||||||
if (!file.exists()) return;
|
if (!file.exists())
|
||||||
|
return;
|
||||||
File backup = null;
|
File backup = null;
|
||||||
for (int i = 0; i <= 100; i++) {
|
for (int i = 0; i <= 100; i++) {
|
||||||
if (i == 100) throw new IllegalArgumentException("failed to backup:" + file.getAbsolutePath());
|
if (i == 100)
|
||||||
|
throw new IllegalArgumentException("failed to backup:" + file.getAbsolutePath());
|
||||||
backup = new File(file.getParent(), file.getName() + "." + i);
|
backup = new File(file.getParent(), file.getName() + "." + i);
|
||||||
if (!backup.exists())
|
if (!backup.exists())
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
FileUtil.copyFile(file, backup);
|
FileUtil.copyFile(file, backup);
|
||||||
System.out.println("Backup: " + file.getAbsolutePath() + " --> " + backup.getAbsolutePath());
|
System.out
|
||||||
|
.println("Backup: " + file.getAbsolutePath() + " --> " + backup.getAbsolutePath());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,6 @@ import org.objectweb.asm.tree.ClassNode;
|
|||||||
import org.objectweb.asm.tree.MethodNode;
|
import org.objectweb.asm.tree.MethodNode;
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.zip.ZipFile;
|
import java.util.zip.ZipFile;
|
||||||
|
|
||||||
@ -44,10 +43,7 @@ public class FSAnalysis extends BreadthFirstSearch<TaintResult, TaintBB> {
|
|||||||
setToAnalysis(toAnalysis);
|
setToAnalysis(toAnalysis);
|
||||||
if (isDebug) {
|
if (isDebug) {
|
||||||
System.out.println("===Method:" + cfg.getMethodNode().name + cfg.getMethodNode().desc);
|
System.out.println("===Method:" + cfg.getMethodNode().name + cfg.getMethodNode().desc);
|
||||||
System.out.println(
|
System.out.println("===Local:" + cfg.getMethodNode().maxLocals + " "
|
||||||
"===Local:"
|
|
||||||
+ cfg.getMethodNode().maxLocals
|
|
||||||
+ " "
|
|
||||||
+ cfg.getMethodNode().maxStack);
|
+ cfg.getMethodNode().maxStack);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -81,9 +77,8 @@ public class FSAnalysis extends BreadthFirstSearch<TaintResult, TaintBB> {
|
|||||||
ContractZipBundle czb = compiler.compile(zf);
|
ContractZipBundle czb = compiler.compile(zf);
|
||||||
cn = czb.mergeContractNode();
|
cn = czb.mergeContractNode();
|
||||||
} else {
|
} else {
|
||||||
cn =
|
cn = compiler.compile(new ByteArrayInputStream(script.getBytes()),
|
||||||
compiler.compile(
|
"contract_main.yjs");
|
||||||
new ByteArrayInputStream(script.getBytes()), "contract_main.yjs");
|
|
||||||
}
|
}
|
||||||
DesktopEngine engine = new DesktopEngine(); // engine.loadJar(zf);
|
DesktopEngine engine = new DesktopEngine(); // engine.loadJar(zf);
|
||||||
engine.loadContract(c, cn, false);
|
engine.loadContract(c, cn, false);
|
||||||
@ -109,7 +104,8 @@ public class FSAnalysis extends BreadthFirstSearch<TaintResult, TaintBB> {
|
|||||||
FSAnalysis analysis = new FSAnalysis(cfg);
|
FSAnalysis analysis = new FSAnalysis(cfg);
|
||||||
analysis.analysis();
|
analysis.analysis();
|
||||||
TaintBB bb = cfg.getLastBlock();
|
TaintBB bb = cfg.getLastBlock();
|
||||||
if (bb != null) result.put(fn.functionName, bb.getResult());
|
if (bb != null)
|
||||||
|
result.put(fn.functionName, bb.getResult());
|
||||||
cfg.printSelf();
|
cfg.printSelf();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -126,7 +126,8 @@ public class AccountIndex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
LenVarTimeSerialIndex2 index = getIndexFile(getString(args, "account") + getString(args, "file"));
|
LenVarTimeSerialIndex2 index =
|
||||||
|
getIndexFile(getString(args, "account") + getString(args, "file"));
|
||||||
long startTime = getLong(args, "startTime");
|
long startTime = getLong(args, "startTime");
|
||||||
long endTime = getLong(args, "endTime");
|
long endTime = getLong(args, "endTime");
|
||||||
List<byte[]> result = index.requestByTime(startTime, endTime);
|
List<byte[]> result = index.requestByTime(startTime, endTime);
|
||||||
@ -183,7 +184,8 @@ public class AccountIndex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
LenVarTimeSerialIndex2 index = getIndexFile(getString(args, "account") + getString(args, "file"));
|
LenVarTimeSerialIndex2 index =
|
||||||
|
getIndexFile(getString(args, "account") + getString(args, "file"));
|
||||||
long date = getLong(args, "date");
|
long date = getLong(args, "date");
|
||||||
String content = getString(args, "content");
|
String content = getString(args, "content");
|
||||||
index.manullyIndex(date, HashUtil.str16ToBytes(content));
|
index.manullyIndex(date, HashUtil.str16ToBytes(content));
|
||||||
|
@ -78,9 +78,8 @@ public class JavaScriptEntry {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void setSM2KeyPair(String pubKey, String privKey) {
|
public static void setSM2KeyPair(String pubKey, String privKey) {
|
||||||
keyPair =
|
keyPair = new SM2KeyPair(SM2KeyPair.publicKeyStr2ECPoint(pubKey),
|
||||||
new SM2KeyPair(
|
new BigInteger(privKey, 16));
|
||||||
SM2KeyPair.publicKeyStr2ECPoint(pubKey), new BigInteger(privKey, 16));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SM2KeyPair getKeyPair() {
|
public static SM2KeyPair getKeyPair() {
|
||||||
@ -136,7 +135,7 @@ public class JavaScriptEntry {
|
|||||||
ByteArrayOutputStream bo = new ByteArrayOutputStream();
|
ByteArrayOutputStream bo = new ByteArrayOutputStream();
|
||||||
byte[] buff = new byte[4 * 1024 * 1024];
|
byte[] buff = new byte[4 * 1024 * 1024];
|
||||||
try {
|
try {
|
||||||
for (int count; (count = in.read(buff)) > 0; ) {
|
for (int count; (count = in.read(buff)) > 0;) {
|
||||||
bo.write(buff, 0, count);
|
bo.write(buff, 0, count);
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
@ -168,8 +167,8 @@ public class JavaScriptEntry {
|
|||||||
return new ApiGate(ip, Integer.parseInt(port));
|
return new ApiGate(ip, Integer.parseInt(port));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String executeContractWithSig(
|
public static String executeContractWithSig(String contractID, String action, String arg,
|
||||||
String contractID, String action, String arg, String pubkey, String sig) {
|
String pubkey, String sig) {
|
||||||
try {
|
try {
|
||||||
ContractRequest app = new ContractRequest();
|
ContractRequest app = new ContractRequest();
|
||||||
app.setContractID(contractID).setAction(action).setArg(arg);
|
app.setContractID(contractID).setAction(action).setArg(arg);
|
||||||
@ -182,21 +181,10 @@ public class JavaScriptEntry {
|
|||||||
app.setFromDebug(isDebug);
|
app.setFromDebug(isDebug);
|
||||||
if (numOfCopies > 1) {
|
if (numOfCopies > 1) {
|
||||||
// The caller is special.
|
// The caller is special.
|
||||||
app.setRequestID(
|
app.setRequestID(app.getPublicKey().hashCode() + "_" + numOfCopies + "_"
|
||||||
app.getPublicKey().hashCode()
|
+ (invokeID++) + "_" + random.nextInt() + "_mul");
|
||||||
+ "_"
|
|
||||||
+ numOfCopies
|
|
||||||
+ "_"
|
|
||||||
+ (invokeID++)
|
|
||||||
+ "_"
|
|
||||||
+ random.nextInt()
|
|
||||||
+ "_mul");
|
|
||||||
} else {
|
} else {
|
||||||
app.setRequestID(
|
app.setRequestID(app.getPublicKey().hashCode() + "_" + (invokeID++) + "_"
|
||||||
app.getPublicKey().hashCode()
|
|
||||||
+ "_"
|
|
||||||
+ (invokeID++)
|
|
||||||
+ "_"
|
|
||||||
+ random.nextInt());
|
+ random.nextInt());
|
||||||
}
|
}
|
||||||
return get.syncGet("dd", "executeContract", JsonUtil.toJson(app));
|
return get.syncGet("dd", "executeContract", JsonUtil.toJson(app));
|
||||||
@ -210,9 +198,8 @@ public class JavaScriptEntry {
|
|||||||
|
|
||||||
public static Object executeContract(String contractID, String action, Object arg) {
|
public static Object executeContract(String contractID, String action, Object arg) {
|
||||||
if (currentSyncUtil.engine.recovering) {
|
if (currentSyncUtil.engine.recovering) {
|
||||||
String str =
|
String str = currentSyncUtil.transRecoverUtil.curRecoverRecord
|
||||||
currentSyncUtil.transRecoverUtil.curRecoverRecord.getExecuteResult(
|
.getExecuteResult(invokeID + "");
|
||||||
invokeID + "");
|
|
||||||
String[] strs = str.split("<seperate>");
|
String[] strs = str.split("<seperate>");
|
||||||
String flag1 = strs[0];
|
String flag1 = strs[0];
|
||||||
String flag = strs[1];
|
String flag = strs[1];
|
||||||
@ -233,29 +220,22 @@ public class JavaScriptEntry {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
ContractRequest app = new ContractRequest();
|
ContractRequest app = new ContractRequest();
|
||||||
app.setContractID(contractID).setAction(action).setArg(JSONTool.convertMirrorToJson(arg));
|
app.setContractID(contractID).setAction(action)
|
||||||
|
.setArg(JSONTool.convertMirrorToJson(arg));
|
||||||
app.doSignature(keyPair);
|
app.doSignature(keyPair);
|
||||||
app.setFromDebug(isDebug);
|
app.setFromDebug(isDebug);
|
||||||
ContractExecType type = ContractProcess.instance.getContract().getType();
|
ContractExecType type = ContractProcess.instance.getContract().getType();
|
||||||
if (type.needSeq()) {
|
if (type.needSeq()) {
|
||||||
app.setRequestID(
|
app.setRequestID(
|
||||||
String.format(
|
String.format("%d_%d_%d_%d_mul", keyPair.getPublicKeyStr().hashCode(),
|
||||||
"%d_%d_%d_%d_mul",
|
numOfCopies, (invokeID++), random.nextInt()));
|
||||||
keyPair.getPublicKeyStr().hashCode(),
|
|
||||||
numOfCopies,
|
|
||||||
(invokeID++),
|
|
||||||
random.nextInt()));
|
|
||||||
// The caller is special.
|
// The caller is special.
|
||||||
flag = 1;
|
flag = 1;
|
||||||
flag1 = 1;
|
flag1 = 1;
|
||||||
LOGGER.warn("invoke contractExecution! " + JsonUtil.toJson(app));
|
LOGGER.warn("invoke contractExecution! " + JsonUtil.toJson(app));
|
||||||
} else {
|
} else {
|
||||||
app.setRequestID(
|
app.setRequestID(String.format("%d_%d_%d", keyPair.getPublicKeyStr().hashCode(),
|
||||||
String.format(
|
(invokeID++), random.nextInt()));
|
||||||
"%d_%d_%d",
|
|
||||||
keyPair.getPublicKeyStr().hashCode(),
|
|
||||||
(invokeID++),
|
|
||||||
random.nextInt()));
|
|
||||||
flag = 1;
|
flag = 1;
|
||||||
flag1 = 1;
|
flag1 = 1;
|
||||||
}
|
}
|
||||||
@ -264,45 +244,38 @@ public class JavaScriptEntry {
|
|||||||
ByteArrayOutputStream bo = new ByteArrayOutputStream();
|
ByteArrayOutputStream bo = new ByteArrayOutputStream();
|
||||||
e.printStackTrace(new PrintStream(bo));
|
e.printStackTrace(new PrintStream(bo));
|
||||||
String result = bo.toString();
|
String result = bo.toString();
|
||||||
if (currentSyncUtil.startFlag
|
if (currentSyncUtil.startFlag && currentSyncUtil.currType == SyncType.Trans
|
||||||
&& currentSyncUtil.currType == SyncType.Trans
|
|
||||||
&& !currentSyncUtil.engine.recovering) {
|
&& !currentSyncUtil.engine.recovering) {
|
||||||
currentSyncUtil.transRecordUtil.recordExecutes(
|
currentSyncUtil.transRecordUtil.recordExecutes(formerInvokeID + "",
|
||||||
formerInvokeID + "", flag1 + "<seperate>" + flag + "<seperate>" + result);
|
flag1 + "<seperate>" + flag + "<seperate>" + result);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Object executeContract(long formerInvokeID, int flag1, int flag, ContractRequest app) {
|
private static Object executeContract(long formerInvokeID, int flag1, int flag,
|
||||||
|
ContractRequest app) {
|
||||||
String result = get.syncGet("dd", "executeContract", JsonUtil.toJson(app));
|
String result = get.syncGet("dd", "executeContract", JsonUtil.toJson(app));
|
||||||
if (currentSyncUtil.startFlag
|
if (currentSyncUtil.startFlag && currentSyncUtil.currType == SyncType.Trans
|
||||||
&& currentSyncUtil.currType == SyncType.Trans
|
|
||||||
&& !currentSyncUtil.engine.recovering) {
|
&& !currentSyncUtil.engine.recovering) {
|
||||||
currentSyncUtil.transRecordUtil.recordExecutes(
|
currentSyncUtil.transRecordUtil.recordExecutes(formerInvokeID + "",
|
||||||
formerInvokeID + "",
|
|
||||||
flag1 + "<seperate>" + flag + "<seperate>" + result);
|
flag1 + "<seperate>" + flag + "<seperate>" + result);
|
||||||
}
|
}
|
||||||
JsonObject jo = JsonUtil.parseStringAsJsonObject(result);
|
JsonObject jo = JsonUtil.parseStringAsJsonObject(result);
|
||||||
return JSONTool.convertJsonElementToMirror(jo);
|
return JSONTool.convertJsonElementToMirror(jo);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void executeContractAsyncWithoutSig(
|
public static void executeContractAsyncWithoutSig(String contractID, String action, String arg,
|
||||||
String contractID, String action, String arg, final ScriptFunction cb) {
|
final ScriptFunction cb) {
|
||||||
try {
|
try {
|
||||||
ContractRequest app = new ContractRequest();
|
ContractRequest app = new ContractRequest();
|
||||||
app.setContractID(contractID).setAction(action).setArg(arg);
|
app.setContractID(contractID).setAction(action).setArg(arg);
|
||||||
app.setRequestID((invokeID++) + "_" + random.nextInt());
|
app.setRequestID((invokeID++) + "_" + random.nextInt());
|
||||||
get.asyncGet(
|
get.asyncGet("dd", "executeContract", JsonUtil.toJson(app), new ResultCallback() {
|
||||||
"dd",
|
|
||||||
"executeContract",
|
|
||||||
JsonUtil.toJson(app),
|
|
||||||
new ResultCallback() {
|
|
||||||
@Override
|
@Override
|
||||||
public void onResult(String str) {
|
public void onResult(String str) {
|
||||||
if (null != cb) {
|
if (null != cb) {
|
||||||
DesktopEngine.applyWithGlobal(
|
DesktopEngine.applyWithGlobal(cb, currentEngine.getNashornGlobal(), str);
|
||||||
cb, currentEngine.getNashornGlobal(), str);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -312,24 +285,20 @@ public class JavaScriptEntry {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String executeContractAsync(
|
public static String executeContractAsync(String contractID, String action, String arg,
|
||||||
String contractID, String action, String arg, final ScriptFunction cb) {
|
final ScriptFunction cb) {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
ContractRequest app = new ContractRequest();
|
ContractRequest app = new ContractRequest();
|
||||||
app.setContractID(contractID).setAction(action).setArg(arg);
|
app.setContractID(contractID).setAction(action).setArg(arg);
|
||||||
app.doSignature(keyPair);
|
app.doSignature(keyPair);
|
||||||
app.setRequestID((invokeID++) + "_" + random());
|
app.setRequestID((invokeID++) + "_" + random());
|
||||||
get.asyncGet(
|
get.asyncGet("dd", "executeContract", JsonUtil.toJson(app), new ResultCallback() {
|
||||||
"dd",
|
|
||||||
"executeContract",
|
|
||||||
JsonUtil.toJson(app),
|
|
||||||
new ResultCallback() {
|
|
||||||
@Override
|
@Override
|
||||||
public void onResult(String str) {
|
public void onResult(String str) {
|
||||||
if (cb != null) {
|
if (cb != null) {
|
||||||
DesktopEngine.applyWithGlobal(
|
DesktopEngine.applyWithGlobal(cb, currentEngine.getNashornGlobal(), str,
|
||||||
cb, currentEngine.getNashornGlobal(), str, arg);
|
arg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -341,7 +310,7 @@ public class JavaScriptEntry {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//YancloudUtil.exceptionReturn({"msg":"missing arguments repoId ","code":1});
|
// YancloudUtil.exceptionReturn({"msg":"missing arguments repoId ","code":1});
|
||||||
public static void exceptionReturn(Object obj) throws ScriptReturnException {
|
public static void exceptionReturn(Object obj) throws ScriptReturnException {
|
||||||
throw new ScriptReturnException(JSONTool.convertMirrorToJson(obj));
|
throw new ScriptReturnException(JSONTool.convertMirrorToJson(obj));
|
||||||
}
|
}
|
||||||
@ -366,10 +335,8 @@ public class JavaScriptEntry {
|
|||||||
* @author Kaidong Wu
|
* @author Kaidong Wu
|
||||||
*/
|
*/
|
||||||
public static void pubEventConstraint(String topic, String content, String constraint) {
|
public static void pubEventConstraint(String topic, String content, String constraint) {
|
||||||
String reqID =
|
String reqID = String.format("%d_%d_%d_%s_pe", keyPair.getPublicKeyStr().hashCode(),
|
||||||
String.format(
|
numOfCopies, invokeID, random());
|
||||||
"%d_%d_%d_%s_pe",
|
|
||||||
keyPair.getPublicKeyStr().hashCode(), numOfCopies, invokeID, random());
|
|
||||||
REvent msg = new REvent(topic, PUBLISH, content, reqID);
|
REvent msg = new REvent(topic, PUBLISH, content, reqID);
|
||||||
if (null != constraint) {
|
if (null != constraint) {
|
||||||
msg.setSemantics(REvent.REventSemantics.valueOf(constraint));
|
msg.setSemantics(REvent.REventSemantics.valueOf(constraint));
|
||||||
@ -412,17 +379,11 @@ public class JavaScriptEntry {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static void subscribe(String topic, ScriptFunction fun, boolean fromPreSub) {
|
private static void subscribe(String topic, ScriptFunction fun, boolean fromPreSub) {
|
||||||
String reqID =
|
String reqID = String.format("%d_%d_%d_%s_se", keyPair.getPublicKeyStr().hashCode(),
|
||||||
String.format(
|
numOfCopies, invokeID, random());
|
||||||
"%d_%d_%d_%s_se",
|
|
||||||
keyPair.getPublicKeyStr().hashCode(), numOfCopies, invokeID, random());
|
|
||||||
|
|
||||||
REvent msg =
|
REvent msg = new REvent(topic, SUBSCRIBE,
|
||||||
new REvent(
|
String.format("{\"subscriber\":\"%s\",\"handler\":\"%s\"}",
|
||||||
topic,
|
|
||||||
SUBSCRIBE,
|
|
||||||
String.format(
|
|
||||||
"{\"subscriber\":\"%s\",\"handler\":\"%s\"}",
|
|
||||||
ContractProcess.instance.getContractName(), fun.getName()),
|
ContractProcess.instance.getContractName(), fun.getName()),
|
||||||
reqID);
|
reqID);
|
||||||
if (fromPreSub) {
|
if (fromPreSub) {
|
||||||
@ -434,10 +395,8 @@ public class JavaScriptEntry {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void unsubscribe(String topic) {
|
public static void unsubscribe(String topic) {
|
||||||
String reqID =
|
String reqID = String.format("%d_%d_%d_%s_us", keyPair.getPublicKeyStr().hashCode(),
|
||||||
String.format(
|
numOfCopies, invokeID, random());
|
||||||
"%d_%d_%d_%s_us",
|
|
||||||
keyPair.getPublicKeyStr().hashCode(), numOfCopies, invokeID, random());
|
|
||||||
String content;
|
String content;
|
||||||
if (null == topic) {
|
if (null == topic) {
|
||||||
content = "{\"subscriber\":\"" + ContractProcess.instance.getContractName() + "\"}";
|
content = "{\"subscriber\":\"" + ContractProcess.instance.getContractName() + "\"}";
|
||||||
@ -447,9 +406,7 @@ public class JavaScriptEntry {
|
|||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
String handler = topic_handlers.get(topic).getName();
|
String handler = topic_handlers.get(topic).getName();
|
||||||
content =
|
content = String.format("{\"subscriber\":\"%s\",\"handler\":\"%s\"}",
|
||||||
String.format(
|
|
||||||
"{\"subscriber\":\"%s\",\"handler\":\"%s\"}",
|
|
||||||
ContractProcess.instance.getContractName(), handler);
|
ContractProcess.instance.getContractName(), handler);
|
||||||
topic_handlers.remove(topic);
|
topic_handlers.remove(topic);
|
||||||
ContractProcess.instance.unSubscribe(handler);
|
ContractProcess.instance.unSubscribe(handler);
|
||||||
@ -468,10 +425,8 @@ public class JavaScriptEntry {
|
|||||||
public static void preSub(String topic, String content) {
|
public static void preSub(String topic, String content) {
|
||||||
String newTopic = topic + "|" + content + "|" + ContractProcess.instance.getContractName();
|
String newTopic = topic + "|" + content + "|" + ContractProcess.instance.getContractName();
|
||||||
subscribe(newTopic, topic_handlers.get(topic), true);
|
subscribe(newTopic, topic_handlers.get(topic), true);
|
||||||
String reqID =
|
String reqID = String.format("%d_%d_%d_%s_pse", keyPair.getPublicKeyStr().hashCode(),
|
||||||
String.format(
|
numOfCopies, (invokeID++), random());
|
||||||
"%d_%d_%d_%s_pse",
|
|
||||||
keyPair.getPublicKeyStr().hashCode(), numOfCopies, (invokeID++), random());
|
|
||||||
REvent msg = new REvent(topic, REvent.REventType.PRESUB, newTopic, reqID);
|
REvent msg = new REvent(topic, REvent.REventType.PRESUB, newTopic, reqID);
|
||||||
msg.setSemantics(REvent.REventSemantics.ONLY_ONCE);
|
msg.setSemantics(REvent.REventSemantics.ONLY_ONCE);
|
||||||
msgList.add(msg);
|
msgList.add(msg);
|
||||||
@ -482,7 +437,8 @@ public class JavaScriptEntry {
|
|||||||
* @author Kaidong Wu
|
* @author Kaidong Wu
|
||||||
*/
|
*/
|
||||||
public static String random() {
|
public static String random() {
|
||||||
String seed = String.valueOf(null == random ? System.currentTimeMillis() : random.nextInt());
|
String seed =
|
||||||
|
String.valueOf(null == random ? System.currentTimeMillis() : random.nextInt());
|
||||||
return HashUtil.sha3(seed);
|
return HashUtil.sha3(seed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,7 +10,6 @@ import java.util.Scanner;
|
|||||||
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipEntry;
|
||||||
import java.util.zip.ZipFile;
|
import java.util.zip.ZipFile;
|
||||||
|
|
||||||
import java.util.zip.ZipInputStream;
|
|
||||||
public class Resources {
|
public class Resources {
|
||||||
private final ZipFile zf;
|
private final ZipFile zf;
|
||||||
YJSClassLoader loader;
|
YJSClassLoader loader;
|
||||||
@ -49,7 +48,7 @@ public class Resources {
|
|||||||
InputStream sc = loadAsInputStream(path);
|
InputStream sc = loadAsInputStream(path);
|
||||||
ByteArrayOutputStream bo = new ByteArrayOutputStream();
|
ByteArrayOutputStream bo = new ByteArrayOutputStream();
|
||||||
byte[] buff = new byte[1024];
|
byte[] buff = new byte[1024];
|
||||||
for (int k = 0; (k = sc.read(buff)) > 0; ) {
|
for (int k = 0; (k = sc.read(buff)) > 0;) {
|
||||||
bo.write(buff, 0, k);
|
bo.write(buff, 0, k);
|
||||||
}
|
}
|
||||||
return new String(bo.toByteArray());
|
return new String(bo.toByteArray());
|
||||||
@ -67,7 +66,8 @@ public class Resources {
|
|||||||
ZipEntry entry = zf.getEntry(path);
|
ZipEntry entry = zf.getEntry(path);
|
||||||
if (entry == null)
|
if (entry == null)
|
||||||
return null;
|
return null;
|
||||||
reader = new BufferedReader(new InputStreamReader(zf.getInputStream(entry), StandardCharsets.UTF_8));
|
reader = new BufferedReader(
|
||||||
|
new InputStreamReader(zf.getInputStream(entry), StandardCharsets.UTF_8));
|
||||||
String line = null;
|
String line = null;
|
||||||
while ((line = reader.readLine()) != null) {
|
while ((line = reader.readLine()) != null) {
|
||||||
fileList.add(line);
|
fileList.add(line);
|
||||||
@ -84,7 +84,8 @@ public class Resources {
|
|||||||
public String unzipToDir(String path) {
|
public String unzipToDir(String path) {
|
||||||
ZipEntry entry = zf.getEntry(path);
|
ZipEntry entry = zf.getEntry(path);
|
||||||
try {
|
try {
|
||||||
return loader.unzipLibrary(zf.getInputStream(entry), entry.getName().replaceAll(".*/", ""));
|
return loader.unzipLibrary(zf.getInputStream(entry),
|
||||||
|
entry.getName().replaceAll(".*/", ""));
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
@ -16,13 +16,16 @@ import java.security.NoSuchAlgorithmException;
|
|||||||
|
|
||||||
@PermissionStub(permission = Permission.AES)
|
@PermissionStub(permission = Permission.AES)
|
||||||
public class AESUtil {
|
public class AESUtil {
|
||||||
public static ScriptObject encrypt(String key, String plaintext) throws NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException, InvalidAlgorithmParameterException, InvalidKeyException {
|
public static ScriptObject encrypt(String key, String plaintext)
|
||||||
|
throws NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException,
|
||||||
|
IllegalBlockSizeException, InvalidAlgorithmParameterException, InvalidKeyException {
|
||||||
JO ret = new JO(PropertyMap.newMap());
|
JO ret = new JO(PropertyMap.newMap());
|
||||||
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
|
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
|
||||||
String iv = generateKey(128);
|
String iv = generateKey(128);
|
||||||
IvParameterSpec ivSpec = new IvParameterSpec(DatatypeConverter.parseHexBinary(iv));
|
IvParameterSpec ivSpec = new IvParameterSpec(DatatypeConverter.parseHexBinary(iv));
|
||||||
byte[] byteContent = plaintext.getBytes();
|
byte[] byteContent = plaintext.getBytes();
|
||||||
SecretKeySpec secretKeySpecSpec = new SecretKeySpec(DatatypeConverter.parseHexBinary(key), "AES");
|
SecretKeySpec secretKeySpecSpec =
|
||||||
|
new SecretKeySpec(DatatypeConverter.parseHexBinary(key), "AES");
|
||||||
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpecSpec, ivSpec);
|
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpecSpec, ivSpec);
|
||||||
byte[] result = cipher.doFinal(byteContent);
|
byte[] result = cipher.doFinal(byteContent);
|
||||||
ret.put("iv", iv, false);
|
ret.put("iv", iv, false);
|
||||||
@ -30,12 +33,16 @@ public class AESUtil {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String decrypt(String key, String ciphertext, String iv) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
|
public static String decrypt(String key, String ciphertext, String iv)
|
||||||
// JO ret = new JO(PropertyMap.newMap());
|
throws NoSuchPaddingException, NoSuchAlgorithmException,
|
||||||
|
InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException,
|
||||||
|
IllegalBlockSizeException {
|
||||||
|
// JO ret = new JO(PropertyMap.newMap());
|
||||||
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
|
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
|
||||||
IvParameterSpec ivSpec = new IvParameterSpec(DatatypeConverter.parseHexBinary(iv));
|
IvParameterSpec ivSpec = new IvParameterSpec(DatatypeConverter.parseHexBinary(iv));
|
||||||
byte[] byteContent = DatatypeConverter.parseHexBinary(ciphertext);
|
byte[] byteContent = DatatypeConverter.parseHexBinary(ciphertext);
|
||||||
SecretKeySpec secretKeySpecSpec = new SecretKeySpec(DatatypeConverter.parseHexBinary(key), "AES");
|
SecretKeySpec secretKeySpecSpec =
|
||||||
|
new SecretKeySpec(DatatypeConverter.parseHexBinary(key), "AES");
|
||||||
cipher.init(Cipher.DECRYPT_MODE, secretKeySpecSpec, ivSpec);
|
cipher.init(Cipher.DECRYPT_MODE, secretKeySpecSpec, ivSpec);
|
||||||
byte[] result = cipher.doFinal(byteContent);
|
byte[] result = cipher.doFinal(byteContent);
|
||||||
return new String(result);
|
return new String(result);
|
||||||
|
@ -18,7 +18,7 @@ import java.util.TimerTask;
|
|||||||
@PermissionStub(permission = Permission.Async)
|
@PermissionStub(permission = Permission.Async)
|
||||||
public class AsyncUtil {
|
public class AsyncUtil {
|
||||||
private static final Timer TIMER = new Timer();
|
private static final Timer TIMER = new Timer();
|
||||||
// public static ExecutorService executorService = Executors.newFixedThreadPool(10);
|
// public static ExecutorService executorService = Executors.newFixedThreadPool(10);
|
||||||
|
|
||||||
public static String sleep(long sleep) {
|
public static String sleep(long sleep) {
|
||||||
try {
|
try {
|
||||||
@ -30,15 +30,13 @@ public class AsyncUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static String postFunction(final ScriptFunction callback, Object wrapper) {
|
public static String postFunction(final ScriptFunction callback, Object wrapper) {
|
||||||
ServiceServer.executor.execute(
|
ServiceServer.executor.execute(() -> JavaScriptEntry.executeFunction(callback, wrapper));
|
||||||
() -> JavaScriptEntry.executeFunction(callback, wrapper));
|
|
||||||
return "success";
|
return "success";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static TimerTask setTimeOut(
|
public static TimerTask setTimeOut(final ScriptFunction callback, long delay,
|
||||||
final ScriptFunction callback, long delay, final Object arg) {
|
final Object arg) {
|
||||||
TimerTask task =
|
TimerTask task = new TimerTask() {
|
||||||
new TimerTask() {
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
JavaScriptEntry.executeFunction(callback, arg);
|
JavaScriptEntry.executeFunction(callback, arg);
|
||||||
@ -48,10 +46,9 @@ public class AsyncUtil {
|
|||||||
return task;
|
return task;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static TimerTask setInterval(
|
public static TimerTask setInterval(final ScriptFunction callback, long delay, long interval,
|
||||||
final ScriptFunction callback, long delay, long interval, final Object arg) {
|
final Object arg) {
|
||||||
TimerTask task =
|
TimerTask task = new TimerTask() {
|
||||||
new TimerTask() {
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
JavaScriptEntry.executeFunction(callback, arg);
|
JavaScriptEntry.executeFunction(callback, arg);
|
||||||
@ -61,22 +58,19 @@ public class AsyncUtil {
|
|||||||
return task;
|
return task;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void executeContractAsyncWithoutSig(
|
public static void executeContractAsyncWithoutSig(String contractID, String action, String arg,
|
||||||
String contractID, String action, String arg, final ScriptFunction cb) {
|
final ScriptFunction cb) {
|
||||||
try {
|
try {
|
||||||
ContractRequest app = new ContractRequest();
|
ContractRequest app = new ContractRequest();
|
||||||
app.setContractID(contractID).setAction(action).setArg(arg);
|
app.setContractID(contractID).setAction(action).setArg(arg);
|
||||||
app.setRequestID((JavaScriptEntry.invokeID++) + "_" + JavaScriptEntry.random.nextInt());
|
app.setRequestID((JavaScriptEntry.invokeID++) + "_" + JavaScriptEntry.random.nextInt());
|
||||||
JavaScriptEntry.get.asyncGet(
|
JavaScriptEntry.get.asyncGet("dd", "executeContract", JsonUtil.toJson(app),
|
||||||
"dd",
|
|
||||||
"executeContract",
|
|
||||||
JsonUtil.toJson(app),
|
|
||||||
new ResultCallback() {
|
new ResultCallback() {
|
||||||
@Override
|
@Override
|
||||||
public void onResult(String str) {
|
public void onResult(String str) {
|
||||||
if (null != cb) {
|
if (null != cb) {
|
||||||
DesktopEngine.applyWithGlobal(
|
DesktopEngine.applyWithGlobal(cb,
|
||||||
cb, JavaScriptEntry.currentEngine.getNashornGlobal(), str);
|
JavaScriptEntry.currentEngine.getNashornGlobal(), str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -85,24 +79,22 @@ public class AsyncUtil {
|
|||||||
e.printStackTrace(new PrintStream(bo));
|
e.printStackTrace(new PrintStream(bo));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public static String executeContractAsync(
|
|
||||||
String contractID, String action, String arg, final ScriptFunction cb) {
|
public static String executeContractAsync(String contractID, String action, String arg,
|
||||||
|
final ScriptFunction cb) {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
ContractRequest app = new ContractRequest();
|
ContractRequest app = new ContractRequest();
|
||||||
app.setContractID(contractID).setAction(action).setArg(arg);
|
app.setContractID(contractID).setAction(action).setArg(arg);
|
||||||
app.doSignature(JavaScriptEntry.getKeyPair());
|
app.doSignature(JavaScriptEntry.getKeyPair());
|
||||||
app.setRequestID((JavaScriptEntry.invokeID++) + "_" + JavaScriptEntry.random());
|
app.setRequestID((JavaScriptEntry.invokeID++) + "_" + JavaScriptEntry.random());
|
||||||
JavaScriptEntry.get.asyncGet(
|
JavaScriptEntry.get.asyncGet("dd", "executeContract", JsonUtil.toJson(app),
|
||||||
"dd",
|
|
||||||
"executeContract",
|
|
||||||
JsonUtil.toJson(app),
|
|
||||||
new ResultCallback() {
|
new ResultCallback() {
|
||||||
@Override
|
@Override
|
||||||
public void onResult(String str) {
|
public void onResult(String str) {
|
||||||
if (cb != null) {
|
if (cb != null) {
|
||||||
DesktopEngine.applyWithGlobal(
|
DesktopEngine.applyWithGlobal(cb,
|
||||||
cb, JavaScriptEntry.currentEngine.getNashornGlobal(), str, arg);
|
JavaScriptEntry.currentEngine.getNashornGlobal(), str, arg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -2,7 +2,6 @@ package org.bdware.sc.boundry.utils;
|
|||||||
|
|
||||||
import org.bdware.sc.ContractProcess;
|
import org.bdware.sc.ContractProcess;
|
||||||
import org.bdware.sc.compiler.PermissionStub;
|
import org.bdware.sc.compiler.PermissionStub;
|
||||||
import org.bdware.sc.db.TimeDBUtil;
|
|
||||||
import org.bdware.sc.db.TimeRocksDBUtil;
|
import org.bdware.sc.db.TimeRocksDBUtil;
|
||||||
import org.bdware.sc.node.Permission;
|
import org.bdware.sc.node.Permission;
|
||||||
|
|
||||||
|
@ -77,7 +77,8 @@ public class DOIPUtil {
|
|||||||
msg = ret.get(0);
|
msg = ret.get(0);
|
||||||
if (msg != null) {
|
if (msg != null) {
|
||||||
return msg;
|
return msg;
|
||||||
} else return DoipMessageFactory.createTimeoutResponse(message.requestID);
|
} else
|
||||||
|
return DoipMessageFactory.createTimeoutResponse(message.requestID);
|
||||||
} catch (Exception ie) {
|
} catch (Exception ie) {
|
||||||
ie.printStackTrace();
|
ie.printStackTrace();
|
||||||
return DoipMessageFactory.createConnectFailedResponse(message.requestID);
|
return DoipMessageFactory.createConnectFailedResponse(message.requestID);
|
||||||
@ -97,13 +98,14 @@ public class DOIPUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String hello(String repoID) {
|
public String hello(String repoID) {
|
||||||
DoipMessage msg = (new DoipMessageFactory.DoipMessageBuilder()).createRequest(repoID, BasicOperations.Hello.getName()).create();
|
DoipMessage msg = (new DoipMessageFactory.DoipMessageBuilder())
|
||||||
|
.createRequest(repoID, BasicOperations.Hello.getName()).create();
|
||||||
return convertDoipMsgToString(syncGetMessage(msg));
|
return convertDoipMsgToString(syncGetMessage(msg));
|
||||||
}
|
}
|
||||||
|
|
||||||
public String retrieve(String doi, String args) {
|
public String retrieve(String doi, String args) {
|
||||||
DoipMessage msg = (new DoipMessageFactory.DoipMessageBuilder()).createRequest(doi, BasicOperations.Retrieve.getName())
|
DoipMessage msg = (new DoipMessageFactory.DoipMessageBuilder())
|
||||||
.create();
|
.createRequest(doi, BasicOperations.Retrieve.getName()).create();
|
||||||
msg.header.parameters.addAttribute("element", "");
|
msg.header.parameters.addAttribute("element", "");
|
||||||
return convertDoipMsgToString(syncGetMessage(msg));
|
return convertDoipMsgToString(syncGetMessage(msg));
|
||||||
}
|
}
|
||||||
@ -126,27 +128,21 @@ public class DOIPUtil {
|
|||||||
}
|
}
|
||||||
e.dataString = null;
|
e.dataString = null;
|
||||||
}
|
}
|
||||||
DoipMessage msg =
|
DoipMessage msg = new DoipMessageFactory.DoipMessageBuilder()
|
||||||
new DoipMessageFactory.DoipMessageBuilder()
|
.createRequest(repoID, BasicOperations.Create.getName()).setBody(digitalObject)
|
||||||
.createRequest(repoID, BasicOperations.Create.getName())
|
|
||||||
.setBody(digitalObject)
|
|
||||||
.create();
|
.create();
|
||||||
return convertDoipMsgToString(syncGetMessage(msg));
|
return convertDoipMsgToString(syncGetMessage(msg));
|
||||||
}
|
}
|
||||||
|
|
||||||
public String delete(String doID) {
|
public String delete(String doID) {
|
||||||
DoipMessage msg =
|
DoipMessage msg = new DoipMessageFactory.DoipMessageBuilder()
|
||||||
new DoipMessageFactory.DoipMessageBuilder()
|
.createRequest(doID, BasicOperations.Delete.getName()).create();
|
||||||
.createRequest(doID, BasicOperations.Delete.getName())
|
|
||||||
.create();
|
|
||||||
return convertDoipMsgToString(syncGetMessage(msg));
|
return convertDoipMsgToString(syncGetMessage(msg));
|
||||||
}
|
}
|
||||||
|
|
||||||
public String listOperation(String doID) {
|
public String listOperation(String doID) {
|
||||||
DoipMessage msg =
|
DoipMessage msg = new DoipMessageFactory.DoipMessageBuilder()
|
||||||
new DoipMessageFactory.DoipMessageBuilder()
|
.createRequest(doID, BasicOperations.ListOps.getName()).create();
|
||||||
.createRequest(doID, BasicOperations.ListOps.getName())
|
|
||||||
.create();
|
|
||||||
return convertDoipMsgToString(syncGetMessage(msg));
|
return convertDoipMsgToString(syncGetMessage(msg));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -222,7 +218,8 @@ public class DOIPUtil {
|
|||||||
return createIrpClient(uri, null, null, null);
|
return createIrpClient(uri, null, null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IRPClientWrapper createIrpClient(String uri, String pubkey, String privateKey, String repoName) {
|
public static IRPClientWrapper createIrpClient(String uri, String pubkey, String privateKey,
|
||||||
|
String repoName) {
|
||||||
EndpointConfig config = new EndpointConfig();
|
EndpointConfig config = new EndpointConfig();
|
||||||
config.routerURI = uri;
|
config.routerURI = uri;
|
||||||
config.repoName = repoName;
|
config.repoName = repoName;
|
||||||
|
@ -25,13 +25,9 @@ public class EmailUtil {
|
|||||||
props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
|
props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
|
||||||
props.setProperty("mail.smtp.socketFactory.fallback", "false");
|
props.setProperty("mail.smtp.socketFactory.fallback", "false");
|
||||||
props.setProperty("mail.smtp.socketFactory.port", jo.get("port").getAsString());
|
props.setProperty("mail.smtp.socketFactory.port", jo.get("port").getAsString());
|
||||||
Session session =
|
Session session = Session.getDefaultInstance(props, new Authenticator() {
|
||||||
Session.getDefaultInstance(
|
|
||||||
props,
|
|
||||||
new Authenticator() {
|
|
||||||
public PasswordAuthentication getPasswordAuthentication() {
|
public PasswordAuthentication getPasswordAuthentication() {
|
||||||
return new PasswordAuthentication(
|
return new PasswordAuthentication(jo.get("from").getAsString(),
|
||||||
jo.get("from").getAsString(),
|
|
||||||
jo.get("pwd").getAsString()); // 发件人邮件用户名、密码
|
jo.get("pwd").getAsString()); // 发件人邮件用户名、密码
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -41,8 +37,8 @@ public class EmailUtil {
|
|||||||
msg.setSubject(jo.get("subject").getAsString());
|
msg.setSubject(jo.get("subject").getAsString());
|
||||||
msg.setText(jo.get("content").getAsString());
|
msg.setText(jo.get("content").getAsString());
|
||||||
msg.setFrom(new InternetAddress(jo.get("from").getAsString()));
|
msg.setFrom(new InternetAddress(jo.get("from").getAsString()));
|
||||||
msg.addRecipient(
|
msg.addRecipient(Message.RecipientType.TO,
|
||||||
Message.RecipientType.TO, new InternetAddress(jo.get("to").getAsString()));
|
new InternetAddress(jo.get("to").getAsString()));
|
||||||
Transport.send(msg);
|
Transport.send(msg);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
@ -48,7 +48,8 @@ public class HttpUtil {
|
|||||||
ScriptObjectMirror som = (ScriptObjectMirror) headers;
|
ScriptObjectMirror som = (ScriptObjectMirror) headers;
|
||||||
for (String key : som.getOwnKeys(true)) {
|
for (String key : som.getOwnKeys(true)) {
|
||||||
Object val = som.get(key);
|
Object val = som.get(key);
|
||||||
if (val instanceof String) connection.setRequestProperty(key, (String) val);
|
if (val instanceof String)
|
||||||
|
connection.setRequestProperty(key, (String) val);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
connection.setRequestProperty("Accept", "application/json");
|
connection.setRequestProperty("Accept", "application/json");
|
||||||
@ -64,7 +65,7 @@ public class HttpUtil {
|
|||||||
InputStream input = connection.getInputStream();
|
InputStream input = connection.getInputStream();
|
||||||
Scanner sc = new Scanner(input);
|
Scanner sc = new Scanner(input);
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
for (; sc.hasNextLine(); ) {
|
for (; sc.hasNextLine();) {
|
||||||
sb.append(sc.nextLine()).append("\n");
|
sb.append(sc.nextLine()).append("\n");
|
||||||
}
|
}
|
||||||
sc.close();
|
sc.close();
|
||||||
@ -77,10 +78,12 @@ public class HttpUtil {
|
|||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
public static String encodeURI(String str){
|
|
||||||
|
public static String encodeURI(String str) {
|
||||||
return URLEncoder.encode(str);
|
return URLEncoder.encode(str);
|
||||||
}
|
}
|
||||||
public static String decodeURI(String str){
|
|
||||||
|
public static String decodeURI(String str) {
|
||||||
return URLDecoder.decode(str);
|
return URLDecoder.decode(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -131,7 +134,8 @@ public class HttpUtil {
|
|||||||
connection.setRequestProperty("Content-Type", "application/json");
|
connection.setRequestProperty("Content-Type", "application/json");
|
||||||
}
|
}
|
||||||
connection.connect();
|
connection.connect();
|
||||||
OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), StandardCharsets.UTF_8);
|
OutputStreamWriter out =
|
||||||
|
new OutputStreamWriter(connection.getOutputStream(), StandardCharsets.UTF_8);
|
||||||
out.append((String) str.get("data"));
|
out.append((String) str.get("data"));
|
||||||
out.flush();
|
out.flush();
|
||||||
out.close();
|
out.close();
|
||||||
@ -156,24 +160,17 @@ public class HttpUtil {
|
|||||||
private static CloseableHttpClient getHttpClient(String url) {
|
private static CloseableHttpClient getHttpClient(String url) {
|
||||||
try {
|
try {
|
||||||
SSLContext sslcontext =
|
SSLContext sslcontext =
|
||||||
SSLContexts.custom()
|
SSLContexts.custom().loadTrustMaterial(null, (arg0, arg1) -> true).build();
|
||||||
.loadTrustMaterial(
|
|
||||||
null,
|
|
||||||
(arg0, arg1) -> true)
|
|
||||||
.build();
|
|
||||||
|
|
||||||
SSLConnectionSocketFactory sslSf =
|
SSLConnectionSocketFactory sslSf = new SSLConnectionSocketFactory(sslcontext, null,
|
||||||
new SSLConnectionSocketFactory(
|
null, new NoopHostnameVerifier());
|
||||||
sslcontext, null, null, new NoopHostnameVerifier());
|
|
||||||
int tle = 10;
|
int tle = 10;
|
||||||
if (url.contains("data.tj.gov.cn")) {
|
if (url.contains("data.tj.gov.cn")) {
|
||||||
tle = 3;
|
tle = 3;
|
||||||
}
|
}
|
||||||
return HttpClients.custom()
|
return HttpClients.custom().setSSLSocketFactory(sslSf)
|
||||||
.setSSLSocketFactory(sslSf)
|
|
||||||
.setKeepAliveStrategy((arg0, arg1) -> 0)
|
.setKeepAliveStrategy((arg0, arg1) -> 0)
|
||||||
.setConnectionTimeToLive(tle, TimeUnit.SECONDS)
|
.setConnectionTimeToLive(tle, TimeUnit.SECONDS).build();
|
||||||
.build();
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
@ -235,18 +232,15 @@ public class HttpUtil {
|
|||||||
RequestBody.create(MediaType.parse("application/json; charset=utf-8"), req.data);
|
RequestBody.create(MediaType.parse("application/json; charset=utf-8"), req.data);
|
||||||
Request request = new Request.Builder().url(req.url).post(body).build(); // 2.瀹氫箟涓<EFBFBD>涓猺equest
|
Request request = new Request.Builder().url(req.url).post(body).build(); // 2.瀹氫箟涓<EFBFBD>涓猺equest
|
||||||
Call call = okHttpClient.newCall(request); //
|
Call call = okHttpClient.newCall(request); //
|
||||||
call.enqueue(
|
call.enqueue(new Callback() { //
|
||||||
new Callback() { //
|
|
||||||
@Override
|
@Override
|
||||||
public void onFailure(Call call, IOException e) {
|
public void onFailure(Call call, IOException e) {}
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onResponse(Call call, Response response) throws IOException {
|
public void onResponse(Call call, Response response) throws IOException {
|
||||||
String result = response.body().string(); //
|
String result = response.body().string(); //
|
||||||
System.out.println("currentEngine:");
|
System.out.println("currentEngine:");
|
||||||
DesktopEngine.applyWithGlobal(
|
DesktopEngine.applyWithGlobal(callback, currentEngine.getNashornGlobal(), result);
|
||||||
callback, currentEngine.getNashornGlobal(), result);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return "success";
|
return "success";
|
||||||
|
@ -1,33 +1,17 @@
|
|||||||
package org.bdware.sc.boundry.utils;
|
package org.bdware.sc.boundry.utils;
|
||||||
|
|
||||||
import com.google.api.client.json.Json;
|
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
import org.bdware.doip.audit.EndpointConfig;
|
import org.bdware.doip.audit.EndpointConfig;
|
||||||
import org.bdware.doip.audit.client.AuditIrpClient;
|
import org.bdware.doip.audit.client.AuditIrpClient;
|
||||||
import org.bdware.doip.audit.config.TempConfigStorage;
|
import org.bdware.doip.audit.config.TempConfigStorage;
|
||||||
import org.bdware.doip.codec.digitalObject.DigitalObject;
|
|
||||||
import org.bdware.doip.codec.digitalObject.Element;
|
|
||||||
import org.bdware.doip.codec.doipMessage.DoipMessage;
|
|
||||||
import org.bdware.doip.codec.doipMessage.DoipMessageFactory;
|
|
||||||
import org.bdware.doip.codec.operations.BasicOperations;
|
|
||||||
import org.bdware.doip.endpoint.client.ClientConfig;
|
|
||||||
import org.bdware.doip.endpoint.client.DoipClientImpl;
|
|
||||||
import org.bdware.doip.endpoint.client.DoipMessageCallback;
|
|
||||||
import org.bdware.irp.exception.IrpClientException;
|
|
||||||
import org.bdware.irp.stateinfo.StateInfoBase;
|
import org.bdware.irp.stateinfo.StateInfoBase;
|
||||||
import org.bdware.sc.compiler.PermissionStub;
|
import org.bdware.sc.compiler.PermissionStub;
|
||||||
import org.bdware.sc.engine.JSONTool;
|
import org.bdware.sc.engine.JSONTool;
|
||||||
import org.bdware.sc.node.Permission;
|
import org.bdware.sc.node.Permission;
|
||||||
import org.bdware.sc.util.JsonUtil;
|
|
||||||
import wrp.jdk.nashorn.api.scripting.ScriptObjectMirror;
|
import wrp.jdk.nashorn.api.scripting.ScriptObjectMirror;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
|
||||||
import java.io.PrintStream;
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@PermissionStub(permission = Permission.IRP)
|
@PermissionStub(permission = Permission.IRP)
|
||||||
public class IRPUtil {
|
public class IRPUtil {
|
||||||
@ -40,7 +24,8 @@ public class IRPUtil {
|
|||||||
EndpointConfig endpointConfig = configStorage.loadAsEndpointConfig();
|
EndpointConfig endpointConfig = configStorage.loadAsEndpointConfig();
|
||||||
|
|
||||||
if (jo.has("clientDoId")) {
|
if (jo.has("clientDoId")) {
|
||||||
this.auditIrpClient = new AuditIrpClient(jo.get("clientDoId").getAsString(), endpointConfig);
|
this.auditIrpClient =
|
||||||
|
new AuditIrpClient(jo.get("clientDoId").getAsString(), endpointConfig);
|
||||||
} else {
|
} else {
|
||||||
this.auditIrpClient = new AuditIrpClient(endpointConfig);
|
this.auditIrpClient = new AuditIrpClient(endpointConfig);
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,7 @@ public class LedgerUtil {
|
|||||||
static SecureRandom random = new SecureRandom((System.currentTimeMillis() + "").getBytes());
|
static SecureRandom random = new SecureRandom((System.currentTimeMillis() + "").getBytes());
|
||||||
|
|
||||||
public static Object getLedgerParams() {
|
public static Object getLedgerParams() {
|
||||||
//format:{nodes:[{ip:ip,port:port}]}
|
// format:{nodes:[{ip:ip,port:port}]}
|
||||||
String ledgerParam = JavaScriptEntry.get.syncGet("", "getLedgerParams", "");
|
String ledgerParam = JavaScriptEntry.get.syncGet("", "getLedgerParams", "");
|
||||||
JsonElement jo = JsonParser.parseString(ledgerParam);
|
JsonElement jo = JsonParser.parseString(ledgerParam);
|
||||||
return JSONTool.convertJsonElementToMirror(jo);
|
return JSONTool.convertJsonElementToMirror(jo);
|
||||||
@ -36,7 +36,8 @@ public class LedgerUtil {
|
|||||||
public static Client getDefaultClient() {
|
public static Client getDefaultClient() {
|
||||||
String ledgerParam = JavaScriptEntry.get.syncGet("", "getLedgerParams", "");
|
String ledgerParam = JavaScriptEntry.get.syncGet("", "getLedgerParams", "");
|
||||||
JsonElement jo = JsonParser.parseString(ledgerParam);
|
JsonElement jo = JsonParser.parseString(ledgerParam);
|
||||||
JsonObject param = jo.getAsJsonObject().get("nodes").getAsJsonArray().get(0).getAsJsonObject();
|
JsonObject param =
|
||||||
|
jo.getAsJsonObject().get("nodes").getAsJsonArray().get(0).getAsJsonObject();
|
||||||
return new Client(param.get("ip").getAsString(), param.get("port").getAsInt());
|
return new Client(param.get("ip").getAsString(), param.get("port").getAsInt());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,7 +58,8 @@ public class LedgerUtil {
|
|||||||
ret.put("to", HashUtil.byteArray2Str(transaction.getTo().toByteArray(), 0), false);
|
ret.put("to", HashUtil.byteArray2Str(transaction.getTo().toByteArray(), 0), false);
|
||||||
ret.put("type", transaction.getType().toString(), false);
|
ret.put("type", transaction.getType().toString(), false);
|
||||||
ret.put("data", new String(transaction.getData().toByteArray()), false);
|
ret.put("data", new String(transaction.getData().toByteArray()), false);
|
||||||
ret.put("blockHsah", HashUtil.byteArray2Str(transaction.getBlockHash().toByteArray(), 0), false);
|
ret.put("blockHsah", HashUtil.byteArray2Str(transaction.getBlockHash().toByteArray(), 0),
|
||||||
|
false);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -66,14 +68,8 @@ public class LedgerUtil {
|
|||||||
String from = str.get("from").toString();
|
String from = str.get("from").toString();
|
||||||
String to = str.get("to").toString();
|
String to = str.get("to").toString();
|
||||||
String data = str.get("data").toString();
|
String data = str.get("data").toString();
|
||||||
SendTransactionResponse result =
|
SendTransactionResponse result = c.sendTransactionSync(ledger, TransactionType.MESSAGE,
|
||||||
c.sendTransactionSync(
|
from, random.nextLong(), to, data.getBytes());
|
||||||
ledger,
|
|
||||||
TransactionType.MESSAGE,
|
|
||||||
from,
|
|
||||||
random.nextLong(),
|
|
||||||
to,
|
|
||||||
data.getBytes());
|
|
||||||
return HashUtil.byteArray2Str(result.getHash().toByteArray(), 0);
|
return HashUtil.byteArray2Str(result.getHash().toByteArray(), 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,12 +18,8 @@ public class MongoDBUtil {
|
|||||||
List addrs = new ArrayList<>();
|
List addrs = new ArrayList<>();
|
||||||
addrs.add(serverAddress);
|
addrs.add(serverAddress);
|
||||||
Method createeScramSha1 =
|
Method createeScramSha1 =
|
||||||
Class.forName("com.mongodb.MongoCredential")
|
Class.forName("com.mongodb.MongoCredential").getDeclaredMethod(
|
||||||
.getDeclaredMethod(
|
"createScramSha1Credential", String.class, String.class, char[].class);
|
||||||
"createScramSha1Credential",
|
|
||||||
String.class,
|
|
||||||
String.class,
|
|
||||||
char[].class);
|
|
||||||
Object credential = createeScramSha1.invoke(null, usrName, dbName, pwd.toCharArray());
|
Object credential = createeScramSha1.invoke(null, usrName, dbName, pwd.toCharArray());
|
||||||
List credentials = new ArrayList<>();
|
List credentials = new ArrayList<>();
|
||||||
credentials.add(credential);
|
credentials.add(credential);
|
||||||
|
@ -116,7 +116,8 @@ public class MultiTagIndexDBUtil {
|
|||||||
|
|
||||||
public List<Long> countInInterval(String tag, long startTime, long endTime, long interval) {
|
public List<Long> countInInterval(String tag, long startTime, long endTime, long interval) {
|
||||||
List<Long> ret = new ArrayList<>();
|
List<Long> ret = new ArrayList<>();
|
||||||
if (interval <= 0) return ret;
|
if (interval <= 0)
|
||||||
|
return ret;
|
||||||
long start = rocksDB.queryOffset(tag, startTime);
|
long start = rocksDB.queryOffset(tag, startTime);
|
||||||
long delta;
|
long delta;
|
||||||
startTime += interval;
|
startTime += interval;
|
||||||
|
@ -35,7 +35,7 @@ public class RocksDBUtil {
|
|||||||
options.setCreateIfMissing(true);
|
options.setCreateIfMissing(true);
|
||||||
File parent = new File("./ContractDB/" + ContractProcess.getContractDir());
|
File parent = new File("./ContractDB/" + ContractProcess.getContractDir());
|
||||||
File dir = new File(parent, path);
|
File dir = new File(parent, path);
|
||||||
//LOGGER.info("init RocksDB in " + dir.getAbsolutePath());
|
// LOGGER.info("init RocksDB in " + dir.getAbsolutePath());
|
||||||
if (!dir.exists()) {
|
if (!dir.exists()) {
|
||||||
LOGGER.info("create directory " + dir.getAbsolutePath() + ": " + dir.mkdirs());
|
LOGGER.info("create directory " + dir.getAbsolutePath() + ": " + dir.mkdirs());
|
||||||
}
|
}
|
||||||
|
@ -46,14 +46,13 @@ public class SM2Util {
|
|||||||
JO ret = new JO(PropertyMap.newMap());
|
JO ret = new JO(PropertyMap.newMap());
|
||||||
try {
|
try {
|
||||||
byte[] sig = ByteUtils.fromHexString(signature);
|
byte[] sig = ByteUtils.fromHexString(signature);
|
||||||
ECPublicKeyParameters pubKey =
|
ECPublicKeyParameters pubKey = BCECUtil.createECPublicKeyFromStrParameters(pubKeyStr,
|
||||||
BCECUtil.createECPublicKeyFromStrParameters(
|
org.zz.gmhelper.SM2Util.CURVE, org.zz.gmhelper.SM2Util.DOMAIN_PARAMS);
|
||||||
pubKeyStr,
|
|
||||||
org.zz.gmhelper.SM2Util.CURVE,
|
|
||||||
org.zz.gmhelper.SM2Util.DOMAIN_PARAMS);
|
|
||||||
boolean value = org.zz.gmhelper.SM2Util.verify(pubKey, content.getBytes(), sig);
|
boolean value = org.zz.gmhelper.SM2Util.verify(pubKey, content.getBytes(), sig);
|
||||||
if (value) ret.put("status", "success", false);
|
if (value)
|
||||||
else ret.put("status", "failed", false);
|
ret.put("status", "success", false);
|
||||||
|
else
|
||||||
|
ret.put("status", "failed", false);
|
||||||
ret.put("result", value, false);
|
ret.put("result", value, false);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
ret.put("status", "failed", false);
|
ret.put("status", "failed", false);
|
||||||
@ -65,9 +64,8 @@ public class SM2Util {
|
|||||||
|
|
||||||
public static String encrypt(String content, String pubkey) {
|
public static String encrypt(String content, String pubkey) {
|
||||||
try {
|
try {
|
||||||
return ByteUtils.toHexString(
|
return ByteUtils.toHexString(org.zz.gmhelper.SM2Util
|
||||||
org.zz.gmhelper.SM2Util.encrypt(
|
.encrypt(SM2KeyPair.publicKeyStr2ECPoint(pubkey), content.getBytes()));
|
||||||
SM2KeyPair.publicKeyStr2ECPoint(pubkey), content.getBytes()));
|
|
||||||
} catch (InvalidCipherTextException e) {
|
} catch (InvalidCipherTextException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
@ -76,12 +74,10 @@ public class SM2Util {
|
|||||||
|
|
||||||
public static String decrypt(String content, String privateKey) {
|
public static String decrypt(String content, String privateKey) {
|
||||||
try {
|
try {
|
||||||
ECPrivateKeyParameters privateKeyParam =
|
ECPrivateKeyParameters privateKeyParam = new ECPrivateKeyParameters(
|
||||||
new ECPrivateKeyParameters(
|
|
||||||
new BigInteger(privateKey, 16), org.zz.gmhelper.SM2Util.DOMAIN_PARAMS);
|
new BigInteger(privateKey, 16), org.zz.gmhelper.SM2Util.DOMAIN_PARAMS);
|
||||||
return new String(
|
return new String(org.zz.gmhelper.SM2Util.decrypt(privateKeyParam,
|
||||||
org.zz.gmhelper.SM2Util.decrypt(
|
ByteUtils.fromHexString(content)));
|
||||||
privateKeyParam, ByteUtils.fromHexString(content)));
|
|
||||||
} catch (InvalidCipherTextException e) {
|
} catch (InvalidCipherTextException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
@ -16,8 +16,7 @@ public class SQLUtil {
|
|||||||
.setContextClassLoader(ContractProcess.instance.engine.getClassLoad());
|
.setContextClassLoader(ContractProcess.instance.engine.getClassLoad());
|
||||||
Class.forName(driver, true, ContractProcess.instance.engine.getClassLoad());
|
Class.forName(driver, true, ContractProcess.instance.engine.getClassLoad());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
System.out.println(
|
System.out.println("Still can't find class! Cl of SQLUtil:\n\t\t"
|
||||||
"Still can't find class! Cl of SQLUtil:\n\t\t"
|
|
||||||
+ SQLUtil.class.getClassLoader());
|
+ SQLUtil.class.getClassLoader());
|
||||||
System.out.println(
|
System.out.println(
|
||||||
"Cl of DEgine:\n\t\t" + ContractProcess.instance.engine.getClassLoad());
|
"Cl of DEgine:\n\t\t" + ContractProcess.instance.engine.getClassLoad());
|
||||||
@ -40,18 +39,15 @@ public class SQLUtil {
|
|||||||
if (password != null && !"undefined".equals(password)) {
|
if (password != null && !"undefined".equals(password)) {
|
||||||
info.put("password", password);
|
info.put("password", password);
|
||||||
}
|
}
|
||||||
if (url.startsWith("jdbc:postgresql")) info.put("sslmode", "allow");
|
if (url.startsWith("jdbc:postgresql"))
|
||||||
|
info.put("sslmode", "allow");
|
||||||
|
|
||||||
Class<?> clz =
|
Class<?> clz = Class.forName("java.sql.DriverManager", true,
|
||||||
Class.forName(
|
|
||||||
"java.sql.DriverManager",
|
|
||||||
true,
|
|
||||||
ContractProcess.instance.engine.getClassLoad());
|
ContractProcess.instance.engine.getClassLoad());
|
||||||
// set caller class into null, thus use YJSClassLoader in
|
// set caller class into null, thus use YJSClassLoader in
|
||||||
// DriverManager.isDriverAllowed(driver,classloader);
|
// DriverManager.isDriverAllowed(driver,classloader);
|
||||||
Method m =
|
Method m = clz.getDeclaredMethod("getConnection", String.class, Properties.class,
|
||||||
clz.getDeclaredMethod(
|
Class.class);
|
||||||
"getConnection", String.class, Properties.class, Class.class);
|
|
||||||
m.setAccessible(true);
|
m.setAccessible(true);
|
||||||
return (Connection) m.invoke(null, url, info, null);
|
return (Connection) m.invoke(null, url, info, null);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -23,7 +23,8 @@ public class UtilRegistry {
|
|||||||
for (String name : allName) {
|
for (String name : allName) {
|
||||||
Class<?> clz;
|
Class<?> clz;
|
||||||
try {
|
try {
|
||||||
clz = Class.forName(String.format("%s.%sUtil", UtilRegistry.class.getPackage().getName(), name));
|
clz = Class.forName(String.format("%s.%sUtil",
|
||||||
|
UtilRegistry.class.getPackage().getName(), name));
|
||||||
ret.add(clz);
|
ret.add(clz);
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@ -52,10 +53,8 @@ public class UtilRegistry {
|
|||||||
|
|
||||||
public static String getInitStr(String s, boolean open) {
|
public static String getInitStr(String s, boolean open) {
|
||||||
if (stubClzNameMap.containsKey(s)) {
|
if (stubClzNameMap.containsKey(s)) {
|
||||||
String ret =
|
String ret = String.format("%sUtil = %s.%sUtil%s;\n", s,
|
||||||
String.format(
|
UtilRegistry.class.getPackage().getName(), s, open ? "" : "Stub");
|
||||||
"%sUtil = %s.%sUtil%s;\n",
|
|
||||||
s, UtilRegistry.class.getPackage().getName(), s, open ? "" : "Stub");
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
return "";
|
return "";
|
||||||
|
@ -9,8 +9,8 @@ public abstract class AnnotationProcessor {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void processFunction(
|
public void processFunction(AnnotationNode anno, ContractNode contractNode,
|
||||||
AnnotationNode anno, ContractNode contractNode, FunctionNode functionNode) throws Exception {
|
FunctionNode functionNode) throws Exception {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,8 @@ public class PermissionStubGenerator extends ClassVisitor implements Opcodes {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
|
public void visit(int version, int access, String name, String signature, String superName,
|
||||||
|
String[] interfaces) {
|
||||||
if (cv != null) {
|
if (cv != null) {
|
||||||
cv.visit(version, access, name + "Stub", null, "java/lang/Object", null);
|
cv.visit(version, access, name + "Stub", null, "java/lang/Object", null);
|
||||||
}
|
}
|
||||||
@ -53,7 +54,8 @@ public class PermissionStubGenerator extends ClassVisitor implements Opcodes {
|
|||||||
mv.visitEnd();
|
mv.visitEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
|
public MethodVisitor visitMethod(int access, String name, String desc, String signature,
|
||||||
|
String[] exceptions) {
|
||||||
if (cv != null) {
|
if (cv != null) {
|
||||||
if (name.equals("<clinit>"))
|
if (name.equals("<clinit>"))
|
||||||
return null;
|
return null;
|
||||||
@ -62,14 +64,15 @@ public class PermissionStubGenerator extends ClassVisitor implements Opcodes {
|
|||||||
}
|
}
|
||||||
|
|
||||||
MethodVisitor mv = cv.visitMethod(access, name, desc, signature,
|
MethodVisitor mv = cv.visitMethod(access, name, desc, signature,
|
||||||
new String[]{"javax/script/ScriptException"});
|
new String[] {"javax/script/ScriptException"});
|
||||||
mv.visitCode();
|
mv.visitCode();
|
||||||
Label l0 = new Label();
|
Label l0 = new Label();
|
||||||
mv.visitLabel(l0);
|
mv.visitLabel(l0);
|
||||||
mv.visitTypeInsn(NEW, "javax/script/ScriptException");
|
mv.visitTypeInsn(NEW, "javax/script/ScriptException");
|
||||||
mv.visitInsn(DUP);
|
mv.visitInsn(DUP);
|
||||||
mv.visitLdcInsn("Do not have " + p + " Permission");
|
mv.visitLdcInsn("Do not have " + p + " Permission");
|
||||||
mv.visitMethodInsn(INVOKESPECIAL, "javax/script/ScriptException", "<init>", "(Ljava/lang/String;)V");
|
mv.visitMethodInsn(INVOKESPECIAL, "javax/script/ScriptException", "<init>",
|
||||||
|
"(Ljava/lang/String;)V");
|
||||||
mv.visitInsn(ATHROW);
|
mv.visitInsn(ATHROW);
|
||||||
mv.visitMaxs(5, 20);
|
mv.visitMaxs(5, 20);
|
||||||
mv.visitEnd();
|
mv.visitEnd();
|
||||||
|
@ -34,8 +34,7 @@ public class YJSCompiler {
|
|||||||
ContractNode contract;
|
ContractNode contract;
|
||||||
private static final Logger LOGGER = LogManager.getLogger(YJSCompiler.class);
|
private static final Logger LOGGER = LogManager.getLogger(YJSCompiler.class);
|
||||||
|
|
||||||
public YJSCompiler() {
|
public YJSCompiler() {}
|
||||||
}
|
|
||||||
|
|
||||||
public static ScriptFunction compileWithGlobal(Source source, Global global, Context context) {
|
public static ScriptFunction compileWithGlobal(Source source, Global global, Context context) {
|
||||||
Global oldGlobal = Context.getGlobal();
|
Global oldGlobal = Context.getGlobal();
|
||||||
@ -55,8 +54,8 @@ public class YJSCompiler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Context makeContext(
|
private static Context makeContext(final InputStream in, final OutputStream out,
|
||||||
final InputStream in, final OutputStream out, final OutputStream err) {
|
final OutputStream err) {
|
||||||
final PrintStream pout =
|
final PrintStream pout =
|
||||||
out instanceof PrintStream ? (PrintStream) out : new PrintStream(out);
|
out instanceof PrintStream ? (PrintStream) out : new PrintStream(out);
|
||||||
final PrintStream perr =
|
final PrintStream perr =
|
||||||
@ -68,7 +67,7 @@ public class YJSCompiler {
|
|||||||
final ErrorManager errors = new ErrorManager(werr);
|
final ErrorManager errors = new ErrorManager(werr);
|
||||||
// Set up options.
|
// Set up options.
|
||||||
final Options options = new Options("nashorn", werr);
|
final Options options = new Options("nashorn", werr);
|
||||||
options.process(new String[]{});
|
options.process(new String[] {});
|
||||||
// detect scripting mode by any source's first character being '#'
|
// detect scripting mode by any source's first character being '#'
|
||||||
options.set("persistent.code.cache", true);
|
options.set("persistent.code.cache", true);
|
||||||
options.set("print.code", "true");
|
options.set("print.code", "true");
|
||||||
@ -92,14 +91,8 @@ public class YJSCompiler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return new Context(
|
return new Context(options, errors, wout, werr,
|
||||||
options,
|
Thread.currentThread().getContextClassLoader(), new YJSFilter(), null);
|
||||||
errors,
|
|
||||||
wout,
|
|
||||||
werr,
|
|
||||||
Thread.currentThread().getContextClassLoader(),
|
|
||||||
new YJSFilter(),
|
|
||||||
null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ContractZipBundle compile(ZipFile zf) throws Exception {
|
public ContractZipBundle compile(ZipFile zf) throws Exception {
|
||||||
@ -115,9 +108,8 @@ public class YJSCompiler {
|
|||||||
// Gson gson = new GsonBuilder().registerTypeAdapter(Contract.Type.class,
|
// Gson gson = new GsonBuilder().registerTypeAdapter(Contract.Type.class,
|
||||||
// typeAdapter)
|
// typeAdapter)
|
||||||
|
|
||||||
ContractManifest cm =
|
ContractManifest cm = JsonUtil.GSON.fromJson(new InputStreamReader(manifestInput),
|
||||||
JsonUtil.GSON.fromJson(
|
ContractManifest.class);
|
||||||
new InputStreamReader(manifestInput), ContractManifest.class);
|
|
||||||
// 如果没有就不限制,根据gas进行插装
|
// 如果没有就不限制,根据gas进行插装
|
||||||
if (0L != cm.getInsnLimit()) {
|
if (0L != cm.getInsnLimit()) {
|
||||||
LOGGER.info("++++++++++++++++++++++true");
|
LOGGER.info("++++++++++++++++++++++true");
|
||||||
@ -128,7 +120,7 @@ public class YJSCompiler {
|
|||||||
Set<String> todo = new HashSet<>();
|
Set<String> todo = new HashSet<>();
|
||||||
Set<String> allEntries = new HashSet<>();
|
Set<String> allEntries = new HashSet<>();
|
||||||
Enumeration<? extends ZipEntry> iter = zf.entries();
|
Enumeration<? extends ZipEntry> iter = zf.entries();
|
||||||
for (; iter.hasMoreElements(); ) {
|
for (; iter.hasMoreElements();) {
|
||||||
ZipEntry ele = iter.nextElement();
|
ZipEntry ele = iter.nextElement();
|
||||||
if (ele != null)
|
if (ele != null)
|
||||||
allEntries.add(ele.getName());
|
allEntries.add(ele.getName());
|
||||||
@ -161,23 +153,21 @@ public class YJSCompiler {
|
|||||||
// add function _preSub
|
// add function _preSub
|
||||||
// Kaidong Wu
|
// Kaidong Wu
|
||||||
String preSubConName = cm.main.substring(0, cm.main.length() - 4) + "PreSub";
|
String preSubConName = cm.main.substring(0, cm.main.length() - 4) + "PreSub";
|
||||||
String preSubContract =
|
String preSubContract = "contract " + preSubConName
|
||||||
"contract "
|
|
||||||
+ preSubConName
|
|
||||||
+ " { function _preSub (e) { YancloudUtil.preSub(e.topic, e.content); }}";
|
+ " { function _preSub (e) { YancloudUtil.preSub(e.topic, e.content); }}";
|
||||||
ContractNode preSubNode =
|
ContractNode preSubNode =
|
||||||
compile(
|
compile(new ByteArrayInputStream(preSubContract.getBytes(StandardCharsets.UTF_8)),
|
||||||
new ByteArrayInputStream(preSubContract.getBytes(StandardCharsets.UTF_8)),
|
|
||||||
preSubConName + ".yjs");
|
preSubConName + ".yjs");
|
||||||
czb.put(preSubConName + ".yjs", preSubNode);
|
czb.put(preSubConName + ".yjs", preSubNode);
|
||||||
LOGGER.info("--compile-- " + preSubConName);
|
LOGGER.info("--compile-- " + preSubConName);
|
||||||
|
|
||||||
String globalBeanName = cm.main.substring(0, cm.main.length() - 4) + "GlobalBean";
|
String globalBeanName = cm.main.substring(0, cm.main.length() - 4) + "GlobalBean";
|
||||||
String globalBeanContract =
|
String globalBeanContract = "contract " + globalBeanName
|
||||||
"contract " + globalBeanName + "{ function setGlobal (_global) { Global = _global; }\n" +
|
+ "{ function setGlobal (_global) { Global = _global; }\n"
|
||||||
" function getGlobal () { return Global; }}";
|
+ " function getGlobal () { return Global; }}";
|
||||||
czb.put(globalBeanName + ".yjs",
|
czb.put(globalBeanName + ".yjs",
|
||||||
compile(new ByteArrayInputStream(globalBeanContract.getBytes(StandardCharsets.UTF_8)),
|
compile(new ByteArrayInputStream(
|
||||||
|
globalBeanContract.getBytes(StandardCharsets.UTF_8)),
|
||||||
globalBeanName + ".yjs"));
|
globalBeanName + ".yjs"));
|
||||||
LOGGER.info("--compile-- " + globalBeanName);
|
LOGGER.info("--compile-- " + globalBeanName);
|
||||||
czb.setMergedContractNode();
|
czb.setMergedContractNode();
|
||||||
@ -202,7 +192,7 @@ public class YJSCompiler {
|
|||||||
contract = reader.visitProgram(tree);
|
contract = reader.visitProgram(tree);
|
||||||
// 遍历完 获取 contract 里的 yjs type
|
// 遍历完 获取 contract 里的 yjs type
|
||||||
contract.initPlainText(cts);
|
contract.initPlainText(cts);
|
||||||
handleModuleAnnotation(contract);//处理注解
|
handleModuleAnnotation(contract);// 处理注解
|
||||||
handleFunctionAnnotation(contract);
|
handleFunctionAnnotation(contract);
|
||||||
return contract;
|
return contract;
|
||||||
}
|
}
|
||||||
@ -219,7 +209,7 @@ public class YJSCompiler {
|
|||||||
|
|
||||||
private void handleFunctionAnnotation(ContractNode contractNode) throws Exception {
|
private void handleFunctionAnnotation(ContractNode contractNode) throws Exception {
|
||||||
for (FunctionNode functionNode : contractNode.getFunctions()) {
|
for (FunctionNode functionNode : contractNode.getFunctions()) {
|
||||||
List<AnnotationNode> annos = functionNode.annotations;//函数里的annotation
|
List<AnnotationNode> annos = functionNode.annotations;// 函数里的annotation
|
||||||
if (annos != null)
|
if (annos != null)
|
||||||
for (AnnotationNode anno : annos) {
|
for (AnnotationNode anno : annos) {
|
||||||
AnnotationProcessor processor = findProcessor(anno);
|
AnnotationProcessor processor = findProcessor(anno);
|
||||||
|
@ -7,6 +7,8 @@ import org.bdware.sc.node.FunctionNode;
|
|||||||
|
|
||||||
public class Confidential extends AnnotationProcessor {
|
public class Confidential extends AnnotationProcessor {
|
||||||
@Override
|
@Override
|
||||||
public void processFunction(AnnotationNode anno, ContractNode contractNode, FunctionNode functionNode) {
|
public void processFunction(AnnotationNode anno, ContractNode contractNode,
|
||||||
functionNode.setConfidential(true); }
|
FunctionNode functionNode) {
|
||||||
|
functionNode.setConfidential(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,8 +9,8 @@ import org.bdware.sc.util.JsonUtil;
|
|||||||
|
|
||||||
public class Cost extends AnnotationProcessor {
|
public class Cost extends AnnotationProcessor {
|
||||||
@Override
|
@Override
|
||||||
public void processFunction(
|
public void processFunction(AnnotationNode anno, ContractNode contractNode,
|
||||||
AnnotationNode anno, ContractNode contractNode, FunctionNode functionNode) {
|
FunctionNode functionNode) {
|
||||||
CostDetail detail = JsonUtil.fromJson(anno.getArgs().get(0), CostDetail.class);
|
CostDetail detail = JsonUtil.fromJson(anno.getArgs().get(0), CostDetail.class);
|
||||||
functionNode.setCost(detail);
|
functionNode.setCost(detail);
|
||||||
if (detail.isCountGas())
|
if (detail.isCountGas())
|
||||||
|
@ -10,7 +10,8 @@ import org.bdware.sc.node.FunctionNode;
|
|||||||
// DOOP is designed for DoipModule which contains specific functions for RepositoryHandler
|
// DOOP is designed for DoipModule which contains specific functions for RepositoryHandler
|
||||||
public class DOOP extends AnnotationProcessor {
|
public class DOOP extends AnnotationProcessor {
|
||||||
@Override
|
@Override
|
||||||
public void processFunction(AnnotationNode anno, ContractNode contractNode, FunctionNode functionNode) throws Exception {
|
public void processFunction(AnnotationNode anno, ContractNode contractNode,
|
||||||
|
FunctionNode functionNode) throws Exception {
|
||||||
// 通过DOOP注解,解析对应的值,并放进对应的FunctionNode中
|
// 通过DOOP注解,解析对应的值,并放进对应的FunctionNode中
|
||||||
functionNode.setIsExport(true);
|
functionNode.setIsExport(true);
|
||||||
functionNode.setIsDoipOperation(true);
|
functionNode.setIsDoipOperation(true);
|
||||||
|
@ -8,7 +8,8 @@ import org.bdware.sc.node.FunctionNode;
|
|||||||
|
|
||||||
public class HomomorphicDecrypt extends AnnotationProcessor {
|
public class HomomorphicDecrypt extends AnnotationProcessor {
|
||||||
@Override
|
@Override
|
||||||
public void processFunction(AnnotationNode anno, ContractNode contractNode, FunctionNode functionNode) {
|
public void processFunction(AnnotationNode anno, ContractNode contractNode,
|
||||||
|
FunctionNode functionNode) {
|
||||||
functionNode.setHomomorphicDecrypt(true);
|
functionNode.setHomomorphicDecrypt(true);
|
||||||
functionNode.setKeyManagerID(anno.getArgs().get(0));
|
functionNode.setKeyManagerID(anno.getArgs().get(0));
|
||||||
functionNode.setSecretID(anno.getArgs().get(1));
|
functionNode.setSecretID(anno.getArgs().get(1));
|
||||||
|
@ -8,7 +8,8 @@ import org.bdware.sc.node.FunctionNode;
|
|||||||
|
|
||||||
public class HomomorphicEncrypt extends AnnotationProcessor {
|
public class HomomorphicEncrypt extends AnnotationProcessor {
|
||||||
@Override
|
@Override
|
||||||
public void processFunction(AnnotationNode anno, ContractNode contractNode, FunctionNode functionNode) {
|
public void processFunction(AnnotationNode anno, ContractNode contractNode,
|
||||||
|
FunctionNode functionNode) {
|
||||||
functionNode.setHomomorphicEncrypt(true);
|
functionNode.setHomomorphicEncrypt(true);
|
||||||
functionNode.setKeyManagerID(anno.getArgs().get(0));
|
functionNode.setKeyManagerID(anno.getArgs().get(0));
|
||||||
functionNode.setSecretID(anno.getArgs().get(1));
|
functionNode.setSecretID(anno.getArgs().get(1));
|
||||||
|
@ -8,10 +8,10 @@ import org.bdware.sc.node.FunctionNode;
|
|||||||
|
|
||||||
public class Join extends AnnotationProcessor {
|
public class Join extends AnnotationProcessor {
|
||||||
@Override
|
@Override
|
||||||
public void processFunction(
|
public void processFunction(AnnotationNode anno, ContractNode contractNode,
|
||||||
AnnotationNode anno, ContractNode contractNode, FunctionNode functionNode) {
|
FunctionNode functionNode) {
|
||||||
// functionNode.setRouteInfo(RouteInfo.create(anno,contractNode));
|
// functionNode.setRouteInfo(RouteInfo.create(anno,contractNode));
|
||||||
//增加标记,在ContractNode中记录Join相关的函数和Join规则
|
// 增加标记,在ContractNode中记录Join相关的函数和Join规则
|
||||||
functionNode.setJoinInfo(JoinInfo.create(anno,contractNode));
|
functionNode.setJoinInfo(JoinInfo.create(anno, contractNode));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,12 +14,11 @@ public class LogLocation extends AnnotationProcessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void processFunction(
|
public void processFunction(AnnotationNode anno, ContractNode contractNode,
|
||||||
AnnotationNode anno, ContractNode contractNode, FunctionNode functionNode) {
|
FunctionNode functionNode) {
|
||||||
if (anno != null && anno.getArgs() != null)
|
if (anno != null && anno.getArgs() != null)
|
||||||
for (String s : anno.getArgs()) {
|
for (String s : anno.getArgs()) {
|
||||||
if (s.equals("\"dataware\"")
|
if (s.equals("\"dataware\"") || s.equals("\"bdledger\"")
|
||||||
|| s.equals("\"bdledger\"")
|
|
||||||
|| s.equals("\"bdledger:\"")) {
|
|| s.equals("\"bdledger:\"")) {
|
||||||
functionNode.setLogToBDContract(true);
|
functionNode.setLogToBDContract(true);
|
||||||
} else if (s.startsWith("\"bdledger:") && s.length() > 11) {
|
} else if (s.startsWith("\"bdledger:") && s.length() > 11) {
|
||||||
|
@ -15,12 +15,13 @@ public class LogType extends AnnotationProcessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void processFunction(
|
public void processFunction(AnnotationNode anno, ContractNode contractNode,
|
||||||
AnnotationNode anno, ContractNode contractNode, FunctionNode functionNode) {
|
FunctionNode functionNode) {
|
||||||
for (String str : anno.getArgs()) {
|
for (String str : anno.getArgs()) {
|
||||||
org.bdware.sc.node.LogType type = org.bdware.sc.node.LogType.parse(str);
|
org.bdware.sc.node.LogType type = org.bdware.sc.node.LogType.parse(str);
|
||||||
functionNode.addLogType(type);
|
functionNode.addLogType(type);
|
||||||
if (type == org.bdware.sc.node.LogType.Branch) contractNode.setInstrumentBranch(true);
|
if (type == org.bdware.sc.node.LogType.Branch)
|
||||||
|
contractNode.setInstrumentBranch(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,17 +1,15 @@
|
|||||||
package org.bdware.sc.compiler.ap;
|
package org.bdware.sc.compiler.ap;
|
||||||
|
|
||||||
import com.google.gson.Gson;
|
|
||||||
import org.bdware.sc.bean.RouteInfo;
|
import org.bdware.sc.bean.RouteInfo;
|
||||||
import org.bdware.sc.compiler.AnnotationProcessor;
|
import org.bdware.sc.compiler.AnnotationProcessor;
|
||||||
import org.bdware.sc.node.AnnotationNode;
|
import org.bdware.sc.node.AnnotationNode;
|
||||||
import org.bdware.sc.node.ContractNode;
|
import org.bdware.sc.node.ContractNode;
|
||||||
import org.bdware.sc.node.CostDetail;
|
|
||||||
import org.bdware.sc.node.FunctionNode;
|
import org.bdware.sc.node.FunctionNode;
|
||||||
|
|
||||||
public class Route extends AnnotationProcessor {
|
public class Route extends AnnotationProcessor {
|
||||||
@Override
|
@Override
|
||||||
public void processFunction(
|
public void processFunction(AnnotationNode anno, ContractNode contractNode,
|
||||||
AnnotationNode anno, ContractNode contractNode, FunctionNode functionNode) {
|
FunctionNode functionNode) {
|
||||||
functionNode.setRouteInfo(RouteInfo.create(anno,contractNode));
|
functionNode.setRouteInfo(RouteInfo.create(anno, contractNode));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,8 +9,8 @@ import org.bdware.sc.node.FunctionNode;
|
|||||||
public class Split extends AnnotationProcessor {
|
public class Split extends AnnotationProcessor {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void processFunction(
|
public void processFunction(AnnotationNode anno, ContractNode contractNode,
|
||||||
AnnotationNode anno, ContractNode contractNode, FunctionNode functionNode) {
|
FunctionNode functionNode) {
|
||||||
functionNode.setRouteInfo(RouteInfo.create(anno,contractNode));
|
functionNode.setRouteInfo(RouteInfo.create(anno, contractNode));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,8 @@ import java.util.concurrent.ThreadFactory;
|
|||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
public class SharableVar {
|
public class SharableVar {
|
||||||
public final static HashedWheelTimer HASHED_WHEEL_TIMER = new HashedWheelTimer(new ThreadFactory() {
|
public final static HashedWheelTimer HASHED_WHEEL_TIMER =
|
||||||
|
new HashedWheelTimer(new ThreadFactory() {
|
||||||
@Override
|
@Override
|
||||||
public Thread newThread(Runnable r) {
|
public Thread newThread(Runnable r) {
|
||||||
Thread t = Executors.defaultThreadFactory().newThread(r);
|
Thread t = Executors.defaultThreadFactory().newThread(r);
|
||||||
@ -31,7 +32,8 @@ public class SharableVar {
|
|||||||
private SyncTimeout nextTimeOut;
|
private SyncTimeout nextTimeOut;
|
||||||
|
|
||||||
|
|
||||||
public SharableVar(String cpId, String identifier, SharableVarManager.VarResolveResult resolveResult) {
|
public SharableVar(String cpId, String identifier,
|
||||||
|
SharableVarManager.VarResolveResult resolveResult) {
|
||||||
counter = new GCounter(cpId, identifier);
|
counter = new GCounter(cpId, identifier);
|
||||||
myId = cpId;
|
myId = cpId;
|
||||||
varId = identifier;
|
varId = identifier;
|
||||||
@ -70,7 +72,7 @@ public class SharableVar {
|
|||||||
|
|
||||||
private void initByVarResolve(SharableVarManager.VarResolveResult resolveResult) {
|
private void initByVarResolve(SharableVarManager.VarResolveResult resolveResult) {
|
||||||
sendTo = new ArrayList<>();
|
sendTo = new ArrayList<>();
|
||||||
//假设没有同一个人既是reader又是writer。
|
// 假设没有同一个人既是reader又是writer。
|
||||||
offset = -1;
|
offset = -1;
|
||||||
for (int i = 0; i < resolveResult.writer.length; i++) {
|
for (int i = 0; i < resolveResult.writer.length; i++) {
|
||||||
if (myId.equals(resolveResult.writer[i])) {
|
if (myId.equals(resolveResult.writer[i])) {
|
||||||
|
@ -49,7 +49,8 @@ public class SharableVarManager {
|
|||||||
String content = message.header.parameters.attributes.get("content").getAsString();
|
String content = message.header.parameters.attributes.get("content").getAsString();
|
||||||
SharableVar var = getVar(varId);
|
SharableVar var = getVar(varId);
|
||||||
var.join(content);
|
var.join(content);
|
||||||
DoipMessageFactory.DoipMessageBuilder builder = new DoipMessageFactory.DoipMessageBuilder();
|
DoipMessageFactory.DoipMessageBuilder builder =
|
||||||
|
new DoipMessageFactory.DoipMessageBuilder();
|
||||||
builder.createResponse(DoipResponseCode.Success, message);
|
builder.createResponse(DoipResponseCode.Success, message);
|
||||||
builder.addAttributes("msg", "success");
|
builder.addAttributes("msg", "success");
|
||||||
return builder.create();
|
return builder.create();
|
||||||
@ -57,7 +58,8 @@ public class SharableVarManager {
|
|||||||
ByteArrayOutputStream bo = new ByteArrayOutputStream();
|
ByteArrayOutputStream bo = new ByteArrayOutputStream();
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
e.printStackTrace(new PrintStream(bo));
|
e.printStackTrace(new PrintStream(bo));
|
||||||
DoipMessageFactory.DoipMessageBuilder builder = new DoipMessageFactory.DoipMessageBuilder();
|
DoipMessageFactory.DoipMessageBuilder builder =
|
||||||
|
new DoipMessageFactory.DoipMessageBuilder();
|
||||||
builder.createResponse(DoipResponseCode.UnKnownError, message);
|
builder.createResponse(DoipResponseCode.UnKnownError, message);
|
||||||
builder.addAttributes("exception", bo.toString());
|
builder.addAttributes("exception", bo.toString());
|
||||||
return builder.create();
|
return builder.create();
|
||||||
@ -83,7 +85,8 @@ public class SharableVarManager {
|
|||||||
client.sendMessage(doipMessage, new DoipMessageCallback() {
|
client.sendMessage(doipMessage, new DoipMessageCallback() {
|
||||||
@Override
|
@Override
|
||||||
public void onResult(DoipMessage doipMessage) {
|
public void onResult(DoipMessage doipMessage) {
|
||||||
LOGGER.info("RECV Sync:" + JsonUtil.toJson(JsonDoipMessage.fromDoipMessage(doipMessage)));
|
LOGGER.info("RECV Sync:"
|
||||||
|
+ JsonUtil.toJson(JsonDoipMessage.fromDoipMessage(doipMessage)));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -104,14 +107,18 @@ public class SharableVarManager {
|
|||||||
|
|
||||||
public synchronized SharableVar createVar(String identifier, String type) {
|
public synchronized SharableVar createVar(String identifier, String type) {
|
||||||
try {
|
try {
|
||||||
if (allVars.containsKey(identifier)) return allVars.get(identifier);
|
if (allVars.containsKey(identifier))
|
||||||
|
return allVars.get(identifier);
|
||||||
StateInfoBase stateInfoBase = client.resolve(identifier);
|
StateInfoBase stateInfoBase = client.resolve(identifier);
|
||||||
if (stateInfoBase.handleValues.has("bdwType") && stateInfoBase.handleValues.get("bdwType").getAsString().equals("SharableVar")) {
|
if (stateInfoBase.handleValues.has("bdwType") && stateInfoBase.handleValues
|
||||||
VarResolveResult resolveResult = JsonUtil.fromJson(stateInfoBase.handleValues, VarResolveResult.class);
|
.get("bdwType").getAsString().equals("SharableVar")) {
|
||||||
|
VarResolveResult resolveResult =
|
||||||
|
JsonUtil.fromJson(stateInfoBase.handleValues, VarResolveResult.class);
|
||||||
SharableVar sharableVar = new SharableVar(cpId, identifier, resolveResult);
|
SharableVar sharableVar = new SharableVar(cpId, identifier, resolveResult);
|
||||||
allVars.put(identifier, sharableVar);
|
allVars.put(identifier, sharableVar);
|
||||||
return sharableVar;
|
return sharableVar;
|
||||||
} else return null;
|
} else
|
||||||
|
return null;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return null;
|
return null;
|
||||||
|
@ -23,23 +23,26 @@ public class ConfidentialContractUtil {
|
|||||||
|
|
||||||
public static final String CONFIDENTIAL_TEMPLATE_PATH = System.getenv("GRAPHENE_DIR")
|
public static final String CONFIDENTIAL_TEMPLATE_PATH = System.getenv("GRAPHENE_DIR")
|
||||||
+ File.separator + "Examples" + File.separator + "nodejs-secret";
|
+ File.separator + "Examples" + File.separator + "nodejs-secret";
|
||||||
public static final String CONFIDENTIAL_SCRIPT_PATH = System.getenv("GRAPHENE_DIR")
|
public static final String CONFIDENTIAL_SCRIPT_PATH =
|
||||||
+ File.separator + "App";
|
System.getenv("GRAPHENE_DIR") + File.separator + "App";
|
||||||
public static final String[] COMMAND = {"bash", "executeContract.sh"};
|
public static final String[] COMMAND = {"bash", "executeContract.sh"};
|
||||||
private static final Type MapType = TypeToken.getParameterized(HashMap.class, String.class, String.class).getType();
|
private static final Type MapType =
|
||||||
|
TypeToken.getParameterized(HashMap.class, String.class, String.class).getType();
|
||||||
|
|
||||||
public static String executeConfidentialContract(ContractRequest input) throws IOException, InterruptedException {
|
public static String executeConfidentialContract(ContractRequest input)
|
||||||
|
throws IOException, InterruptedException {
|
||||||
File runDir = new File(CONFIDENTIAL_SCRIPT_PATH + File.separator + input.getRequestID());
|
File runDir = new File(CONFIDENTIAL_SCRIPT_PATH + File.separator + input.getRequestID());
|
||||||
ProcessBuilder pb = new ProcessBuilder(COMMAND);
|
ProcessBuilder pb = new ProcessBuilder(COMMAND);
|
||||||
pb.directory(runDir);
|
pb.directory(runDir);
|
||||||
Process p = pb.start();
|
Process p = pb.start();
|
||||||
p.waitFor();
|
p.waitFor();
|
||||||
File resultFile = new File(CONFIDENTIAL_SCRIPT_PATH + File.separator + input.getRequestID() +
|
File resultFile = new File(CONFIDENTIAL_SCRIPT_PATH + File.separator + input.getRequestID()
|
||||||
File.separator + "result.json");
|
+ File.separator + "result.json");
|
||||||
return FileUtils.readFileToString(resultFile, StandardCharsets.UTF_8);
|
return FileUtils.readFileToString(resultFile, StandardCharsets.UTF_8);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void generateConfidentialContract(ContractNode cn, ScriptObjectMirror globalVars, Global global) {
|
public static void generateConfidentialContract(ContractNode cn, ScriptObjectMirror globalVars,
|
||||||
|
Global global) {
|
||||||
List<FunctionNode> functionNodes = cn.getFunctions();
|
List<FunctionNode> functionNodes = cn.getFunctions();
|
||||||
for (FunctionNode fn : functionNodes) {
|
for (FunctionNode fn : functionNodes) {
|
||||||
// assuming only one confidential function for now
|
// assuming only one confidential function for now
|
||||||
@ -54,18 +57,46 @@ public class ConfidentialContractUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// load necessary Node.js libraries
|
// load necessary Node.js libraries
|
||||||
jsStr.append("var fs = require('fs');\n" + "var crypto = require('crypto');\n" + "var sm2 = require('sm-crypto').sm2;\n");
|
jsStr.append("var fs = require('fs');\n" + "var crypto = require('crypto');\n"
|
||||||
|
+ "var sm2 = require('sm-crypto').sm2;\n");
|
||||||
// load Global variables and arguments from files
|
// load Global variables and arguments from files
|
||||||
jsStr.append("let rawGlobal = fs.readFileSync('global.json').toString();\n" + "let Global = JSON.parse(rawGlobal);\n");
|
jsStr.append("let rawGlobal = fs.readFileSync('global.json').toString();\n"
|
||||||
jsStr.append("let rawArg = fs.readFileSync('arg.json').toString();\n" + "let jsonArg = JSON.parse(rawArg);\n" + "let requester = jsonArg.requester;\n" + "let arg = jsonArg.arg;\n");
|
+ "let Global = JSON.parse(rawGlobal);\n");
|
||||||
|
jsStr.append("let rawArg = fs.readFileSync('arg.json').toString();\n"
|
||||||
|
+ "let jsonArg = JSON.parse(rawArg);\n"
|
||||||
|
+ "let requester = jsonArg.requester;\n" + "let arg = jsonArg.arg;\n");
|
||||||
jsStr.append("let srcStr = fs.readFileSync('contract.js').toString();\n");
|
jsStr.append("let srcStr = fs.readFileSync('contract.js').toString();\n");
|
||||||
// verify signatures and decrypt all confidential variables Important!!!!!
|
// verify signatures and decrypt all confidential variables Important!!!!!
|
||||||
jsStr.append("for (var k in Global) {\n" + " if (Global.hasOwnProperty(k)) {\n" + " if (k.startsWith('conf_')) {\n" + " let sig = Global[k].signature;\n" + " let pubKey = Global[k].owner;\n" + " let verifyResult = sm2.doVerifySignature(srcStr, sig, pubKey);\n" + " if (verifyResult) {\n" + " let newKey = k.substring(5);\n" + " let decKey = Buffer.from(process.env['KEY_'+pubKey.substring(0,10).toUpperCase()], 'hex');\n" + " let decIv = Buffer.from(Global[k].iv, 'hex');\n" + " let cipherText = Buffer.from(Global[k].cipherText, 'hex');\n" + " let decipher = crypto.createDecipheriv('aes-256-cbc', decKey, decIv);\n" + " let decrypted = decipher.update(cipherText);\n" + " decrypted = Buffer.concat([decrypted, decipher.final()]);\n" + " let plaintext = decrypted.toString();\n" + " Global[newKey] = plaintext;\n" + " }\n" + " }\n" + " }\n" + "}\n");
|
jsStr.append("for (var k in Global) {\n" + " if (Global.hasOwnProperty(k)) {\n"
|
||||||
|
+ " if (k.startsWith('conf_')) {\n"
|
||||||
|
+ " let sig = Global[k].signature;\n"
|
||||||
|
+ " let pubKey = Global[k].owner;\n"
|
||||||
|
+ " let verifyResult = sm2.doVerifySignature(srcStr, sig, pubKey);\n"
|
||||||
|
+ " if (verifyResult) {\n" + " let newKey = k.substring(5);\n"
|
||||||
|
+ " let decKey = Buffer.from(process.env['KEY_'+pubKey.substring(0,10).toUpperCase()], 'hex');\n"
|
||||||
|
+ " let decIv = Buffer.from(Global[k].iv, 'hex');\n"
|
||||||
|
+ " let cipherText = Buffer.from(Global[k].cipherText, 'hex');\n"
|
||||||
|
+ " let decipher = crypto.createDecipheriv('aes-256-cbc', decKey, decIv);\n"
|
||||||
|
+ " let decrypted = decipher.update(cipherText);\n"
|
||||||
|
+ " decrypted = Buffer.concat([decrypted, decipher.final()]);\n"
|
||||||
|
+ " let plaintext = decrypted.toString();\n"
|
||||||
|
+ " Global[newKey] = plaintext;\n" + " }\n" + " }\n"
|
||||||
|
+ " }\n" + "}\n");
|
||||||
// call function
|
// call function
|
||||||
jsStr.append("var ret = ").append(fn.functionName).append("(arg, requester, null);\n");
|
jsStr.append("var ret = ").append(fn.functionName)
|
||||||
// TODO: encrypt all confidential variables so state can be updated in confidential function @shujunyi
|
.append("(arg, requester, null);\n");
|
||||||
|
// TODO: encrypt all confidential variables so state can be updated in confidential
|
||||||
|
// function @shujunyi
|
||||||
// encrypt return value and write to a file
|
// encrypt return value and write to a file
|
||||||
jsStr.append("var retStr = JSON.stringify(ret);\n" + "var key = Buffer.from(process.env['KEY_'+requester.substring(0,10).toUpperCase()], 'hex');\n" + "var iv = crypto.randomBytes(16);\n" + "let cipher = crypto.createCipheriv('aes-256-cbc', key, iv); \n" + "let encRet = cipher.update(retStr);\n" + "encRet = Buffer.concat([encRet, cipher.final()]);\n" + "let result = {iv: iv.toString('hex'), encryptedData: encRet.toString('hex')};\n" + "let resultStr = JSON.stringify(result);\n" + "fs.writeFileSync('result.json', resultStr);\n");
|
jsStr.append("var retStr = JSON.stringify(ret);\n"
|
||||||
|
+ "var key = Buffer.from(process.env['KEY_'+requester.substring(0,10).toUpperCase()], 'hex');\n"
|
||||||
|
+ "var iv = crypto.randomBytes(16);\n"
|
||||||
|
+ "let cipher = crypto.createCipheriv('aes-256-cbc', key, iv); \n"
|
||||||
|
+ "let encRet = cipher.update(retStr);\n"
|
||||||
|
+ "encRet = Buffer.concat([encRet, cipher.final()]);\n"
|
||||||
|
+ "let result = {iv: iv.toString('hex'), encryptedData: encRet.toString('hex')};\n"
|
||||||
|
+ "let resultStr = JSON.stringify(result);\n"
|
||||||
|
+ "fs.writeFileSync('result.json', resultStr);\n");
|
||||||
// put script into Global so owner can send it and collect signatures
|
// put script into Global so owner can send it and collect signatures
|
||||||
Object som = ScriptObjectMirror.wrap(jsStr.toString(), global);
|
Object som = ScriptObjectMirror.wrap(jsStr.toString(), global);
|
||||||
globalVars.put("src_" + fn.functionName, som);
|
globalVars.put("src_" + fn.functionName, som);
|
||||||
@ -85,11 +116,8 @@ public class ConfidentialContractUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void dumpScriptAndStates(
|
public static void dumpScriptAndStates(Invocable engine, FunctionNode functionNode,
|
||||||
Invocable engine,
|
ContractRequest input, ScriptObjectMirror globalVars)
|
||||||
FunctionNode functionNode,
|
|
||||||
ContractRequest input,
|
|
||||||
ScriptObjectMirror globalVars)
|
|
||||||
throws IOException, ScriptException, NoSuchMethodException {
|
throws IOException, ScriptException, NoSuchMethodException {
|
||||||
Map<String, Object> globalMap = (Map<String, Object>) convertIntoJavaObject(globalVars);
|
Map<String, Object> globalMap = (Map<String, Object>) convertIntoJavaObject(globalVars);
|
||||||
String dest = CONFIDENTIAL_SCRIPT_PATH + File.separator + input.getRequestID();
|
String dest = CONFIDENTIAL_SCRIPT_PATH + File.separator + input.getRequestID();
|
||||||
@ -136,156 +164,116 @@ public class ConfidentialContractUtil {
|
|||||||
return dependentFunctions;
|
return dependentFunctions;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String generateGrapheneManifestStr(Invocable engine, ContractRequest input) throws ScriptException, NoSuchMethodException {
|
private static String generateGrapheneManifestStr(Invocable engine, ContractRequest input)
|
||||||
String manifestStr = "# Nodejs manifest file example\n" +
|
throws ScriptException, NoSuchMethodException {
|
||||||
"#\n" +
|
String manifestStr = "# Nodejs manifest file example\n" + "#\n"
|
||||||
"# This manifest was prepared and tested on Ubuntu 18.04.\n" +
|
+ "# This manifest was prepared and tested on Ubuntu 18.04.\n" + "\n"
|
||||||
"\n" +
|
+ "loader.argv0_override = \"nodejs\"\n" + "\n"
|
||||||
"loader.argv0_override = \"nodejs\"\n" +
|
+ "# LibOS layer library of Graphene. There is currently only one implementation,\n"
|
||||||
"\n" +
|
+ "# so it is always set to libsysdb.so.\n"
|
||||||
"# LibOS layer library of Graphene. There is currently only one implementation,\n" +
|
+ "loader.preload = \"file:$(GRAPHENEDIR)/Runtime/libsysdb.so\"\n" + "\n"
|
||||||
"# so it is always set to libsysdb.so.\n" +
|
+ "# Show/hide debug log of Graphene ('inline' or 'none' respectively).\n"
|
||||||
"loader.preload = \"file:$(GRAPHENEDIR)/Runtime/libsysdb.so\"\n" +
|
+ "loader.debug_type = \"$(GRAPHENEDEBUG)\"\n" + "\n"
|
||||||
"\n" +
|
+ "# Read application arguments directly from the command line. Don't use this on production!\n"
|
||||||
"# Show/hide debug log of Graphene ('inline' or 'none' respectively).\n" +
|
+ "loader.insecure__use_cmdline_argv = 1\n" + "\n"
|
||||||
"loader.debug_type = \"$(GRAPHENEDEBUG)\"\n" +
|
+ "# Specify paths to search for libraries. The usual LD_LIBRARY_PATH syntax\n"
|
||||||
"\n" +
|
+ "# applies. Paths must be in-Graphene visible paths, not host-OS paths (i.e.,\n"
|
||||||
"# Read application arguments directly from the command line. Don't use this on production!\n" +
|
+ "# paths must be taken from fs.mount.xxx.path, not fs.mount.xxx.uri).\n"
|
||||||
"loader.insecure__use_cmdline_argv = 1\n" +
|
+ "loader.env.LD_LIBRARY_PATH = \"/lib:/usr/lib:$(ARCH_LIBDIR):/usr/$(ARCH_LIBDIR):./\"\n"
|
||||||
"\n" +
|
+ "\n"
|
||||||
"# Specify paths to search for libraries. The usual LD_LIBRARY_PATH syntax\n" +
|
+ "# Mount host-OS directory to required libraries (in 'uri') into in-Graphene\n"
|
||||||
"# applies. Paths must be in-Graphene visible paths, not host-OS paths (i.e.,\n" +
|
+ "# visible directory /lib (in 'path').\n" + "fs.mount.lib.type = \"chroot\"\n"
|
||||||
"# paths must be taken from fs.mount.xxx.path, not fs.mount.xxx.uri).\n" +
|
+ "fs.mount.lib.path = \"/lib\"\n"
|
||||||
"loader.env.LD_LIBRARY_PATH = \"/lib:/usr/lib:$(ARCH_LIBDIR):/usr/$(ARCH_LIBDIR):./\"\n" +
|
+ "fs.mount.lib.uri = \"file:$(GRAPHENEDIR)/Runtime\"\n" + "\n"
|
||||||
"\n" +
|
+ "fs.mount.lib2.type = \"chroot\"\n" + "fs.mount.lib2.path = \"$(ARCH_LIBDIR)\"\n"
|
||||||
"# Mount host-OS directory to required libraries (in 'uri') into in-Graphene\n" +
|
+ "fs.mount.lib2.uri = \"file:$(ARCH_LIBDIR)\"\n" + "\n"
|
||||||
"# visible directory /lib (in 'path').\n" +
|
+ "#fs.mount.lib3.type = \"chroot\"\n"
|
||||||
"fs.mount.lib.type = \"chroot\"\n" +
|
+ "#fs.mount.lib3.path = \"/usr/$(ARCH_LIBDIR)\"\n"
|
||||||
"fs.mount.lib.path = \"/lib\"\n" +
|
+ "#fs.mount.lib3.uri = \"file:/usr/$(ARCH_LIBDIR)\"\n" + "\n"
|
||||||
"fs.mount.lib.uri = \"file:$(GRAPHENEDIR)/Runtime\"\n" +
|
+ "fs.mount.usr.type = \"chroot\"\n" + "fs.mount.usr.path = \"/usr\"\n"
|
||||||
"\n" +
|
+ "fs.mount.usr.uri = \"file:/usr\"\n" + "\n"
|
||||||
"fs.mount.lib2.type = \"chroot\"\n" +
|
+ "# Host-level directory to NSS files required by Glibc + NSS libs\n"
|
||||||
"fs.mount.lib2.path = \"$(ARCH_LIBDIR)\"\n" +
|
+ "fs.mount.etc.type = \"chroot\"\n" + "fs.mount.etc.path = \"/etc\"\n"
|
||||||
"fs.mount.lib2.uri = \"file:$(ARCH_LIBDIR)\"\n" +
|
+ "fs.mount.etc.uri = \"file:/etc\"\n" + "\n"
|
||||||
"\n" +
|
+ "# Workload needs to create temporary files\n"
|
||||||
"#fs.mount.lib3.type = \"chroot\"\n" +
|
+ "fs.mount.tmp.type = \"chroot\"\n" + "fs.mount.tmp.path = \"/tmp\"\n"
|
||||||
"#fs.mount.lib3.path = \"/usr/$(ARCH_LIBDIR)\"\n" +
|
+ "fs.mount.tmp.uri = \"file:/tmp\"\n" + "\n"
|
||||||
"#fs.mount.lib3.uri = \"file:/usr/$(ARCH_LIBDIR)\"\n" +
|
+ "# Set enclave size to 2GB; NodeJS expects around 1.7GB of heap on startup,\n"
|
||||||
"\n" +
|
+ "# see e.g. https://github.com/nodejs/node/issues/13018.\n"
|
||||||
"fs.mount.usr.type = \"chroot\"\n" +
|
+ "# Recall that SGX v1 requires to specify enclave size at enclave creation time.\n"
|
||||||
"fs.mount.usr.path = \"/usr\"\n" +
|
+ "sgx.enclave_size = \"2G\"\n" + "\n"
|
||||||
"fs.mount.usr.uri = \"file:/usr\"\n" +
|
+ "# Set maximum number of in-enclave threads (somewhat arbitrarily) to 8. Recall\n"
|
||||||
"\n" +
|
+ "# that SGX v1 requires to specify the maximum number of simultaneous threads at\n"
|
||||||
"# Host-level directory to NSS files required by Glibc + NSS libs\n" +
|
+ "# enclave creation time.\n" + "sgx.thread_num = 16\n" + "\n"
|
||||||
"fs.mount.etc.type = \"chroot\"\n" +
|
+ "# Specify all libraries used by Node.js and its dependencies (including all libs\n"
|
||||||
"fs.mount.etc.path = \"/etc\"\n" +
|
+ "# which can be loaded at runtime via dlopen).\n"
|
||||||
"fs.mount.etc.uri = \"file:/etc\"\n" +
|
+ "sgx.trusted_files.ld = \"file:$(GRAPHENEDIR)/Runtime/ld-linux-x86-64.so.2\"\n"
|
||||||
"\n" +
|
+ "sgx.trusted_files.libc = \"file:$(GRAPHENEDIR)/Runtime/libc.so.6\"\n"
|
||||||
"# Workload needs to create temporary files\n" +
|
+ "sgx.trusted_files.libm = \"file:$(GRAPHENEDIR)/Runtime/libm.so.6\"\n"
|
||||||
"fs.mount.tmp.type = \"chroot\"\n" +
|
+ "sgx.trusted_files.libdl = \"file:$(GRAPHENEDIR)/Runtime/libdl.so.2\"\n"
|
||||||
"fs.mount.tmp.path = \"/tmp\"\n" +
|
+ "sgx.trusted_files.librt = \"file:$(GRAPHENEDIR)/Runtime/librt.so.1\"\n"
|
||||||
"fs.mount.tmp.uri = \"file:/tmp\"\n" +
|
+ "sgx.trusted_files.libutil = \"file:$(GRAPHENEDIR)/Runtime/libutil.so.1\"\n"
|
||||||
"\n" +
|
+ "sgx.trusted_files.libpthread = \"file:$(GRAPHENEDIR)/Runtime/libpthread.so.0\"\n"
|
||||||
"# Set enclave size to 2GB; NodeJS expects around 1.7GB of heap on startup,\n" +
|
+ "sgx.trusted_files.libnssdns = \"file:$(GRAPHENEDIR)/Runtime/libnss_dns.so.2\"\n"
|
||||||
"# see e.g. https://github.com/nodejs/node/issues/13018.\n" +
|
+ "sgx.trusted_files.libresolv = \"file:$(GRAPHENEDIR)/Runtime/libresolv.so.2\"\n"
|
||||||
"# Recall that SGX v1 requires to specify enclave size at enclave creation time.\n" +
|
+ "\n" + "sgx.trusted_files.libstdc = \"file:/usr/$(ARCH_LIBDIR)/libstdc++.so.6\"\n"
|
||||||
"sgx.enclave_size = \"2G\"\n" +
|
+ "sgx.trusted_files.libgccs = \"file:$(ARCH_LIBDIR)/libgcc_s.so.1\"\n"
|
||||||
"\n" +
|
+ "sgx.trusted_files.libaptpkg = \"file:/usr/$(ARCH_LIBDIR)/libapt-pkg.so.5.0\"\n"
|
||||||
"# Set maximum number of in-enclave threads (somewhat arbitrarily) to 8. Recall\n" +
|
+ "sgx.trusted_files.liblz4 = \"file:/usr/$(ARCH_LIBDIR)/liblz4.so.1\"\n"
|
||||||
"# that SGX v1 requires to specify the maximum number of simultaneous threads at\n" +
|
+ "sgx.trusted_files.libsystemd = \"file:$(ARCH_LIBDIR)/libsystemd.so.0\"\n"
|
||||||
"# enclave creation time.\n" +
|
+ "sgx.trusted_files.libselinux = \"file:$(ARCH_LIBDIR)/libselinux.so.1\"\n"
|
||||||
"sgx.thread_num = 16\n" +
|
+ "sgx.trusted_files.libgcrypt = \"file:$(ARCH_LIBDIR)/libgcrypt.so.20\"\n"
|
||||||
"\n" +
|
+ "sgx.trusted_files.libpcre = \"file:$(ARCH_LIBDIR)/libpcre.so.3\"\n"
|
||||||
"# Specify all libraries used by Node.js and its dependencies (including all libs\n" +
|
+ "sgx.trusted_files.libgpgerror = \"file:$(ARCH_LIBDIR)/libgpg-error.so.0\"\n"
|
||||||
"# which can be loaded at runtime via dlopen).\n" +
|
+ "sgx.trusted_files.libexpat = \"file:$(ARCH_LIBDIR)/libexpat.so.1\"\n"
|
||||||
"sgx.trusted_files.ld = \"file:$(GRAPHENEDIR)/Runtime/ld-linux-x86-64.so.2\"\n" +
|
+ "sgx.trusted_files.libz = \"file:$(ARCH_LIBDIR)/libz.so.1\"\n"
|
||||||
"sgx.trusted_files.libc = \"file:$(GRAPHENEDIR)/Runtime/libc.so.6\"\n" +
|
+ "sgx.trusted_files.libz2 = \"file:$(ARCH_LIBDIR)/libbz2.so.1.0\"\n"
|
||||||
"sgx.trusted_files.libm = \"file:$(GRAPHENEDIR)/Runtime/libm.so.6\"\n" +
|
+ "sgx.trusted_files.liblzma = \"file:$(ARCH_LIBDIR)/liblzma.so.5\"\n"
|
||||||
"sgx.trusted_files.libdl = \"file:$(GRAPHENEDIR)/Runtime/libdl.so.2\"\n" +
|
+ "sgx.trusted_files.libmpdec = \"file:/usr/$(ARCH_LIBDIR)/libmpdec.so.2\"\n" + "\n"
|
||||||
"sgx.trusted_files.librt = \"file:$(GRAPHENEDIR)/Runtime/librt.so.1\"\n" +
|
+ "# Name Service Switch (NSS) libraries (Glibc dependencies)\n"
|
||||||
"sgx.trusted_files.libutil = \"file:$(GRAPHENEDIR)/Runtime/libutil.so.1\"\n" +
|
+ "sgx.trusted_files.libnssfiles = \"file:$(ARCH_LIBDIR)/libnss_files.so.2\"\n"
|
||||||
"sgx.trusted_files.libpthread = \"file:$(GRAPHENEDIR)/Runtime/libpthread.so.0\"\n" +
|
+ "sgx.trusted_files.libnsscompat = \"file:$(ARCH_LIBDIR)/libnss_compat.so.2\"\n"
|
||||||
"sgx.trusted_files.libnssdns = \"file:$(GRAPHENEDIR)/Runtime/libnss_dns.so.2\"\n" +
|
+ "sgx.trusted_files.libnssnis = \"file:$(ARCH_LIBDIR)/libnss_nis.so.2\"\n"
|
||||||
"sgx.trusted_files.libresolv = \"file:$(GRAPHENEDIR)/Runtime/libresolv.so.2\"\n" +
|
+ "sgx.trusted_files.libnsl = \"file:$(ARCH_LIBDIR)/libnsl.so.1\"\n"
|
||||||
"\n" +
|
+ "sgx.trusted_files.libnssmyhostname = \"file:$(ARCH_LIBDIR)/libnss_myhostname.so.2\"\n"
|
||||||
"sgx.trusted_files.libstdc = \"file:/usr/$(ARCH_LIBDIR)/libstdc++.so.6\"\n" +
|
+ "sgx.trusted_files.libnssmdns = \"file:$(ARCH_LIBDIR)/libnss_mdns4_minimal.so.2\"\n"
|
||||||
"sgx.trusted_files.libgccs = \"file:$(ARCH_LIBDIR)/libgcc_s.so.1\"\n" +
|
+ "\n" + "# Scratch space\n" + "sgx.allowed_files.tmp = \"file:/tmp\"\n" + "\n"
|
||||||
"sgx.trusted_files.libaptpkg = \"file:/usr/$(ARCH_LIBDIR)/libapt-pkg.so.5.0\"\n" +
|
+ "# APT config files\n"
|
||||||
"sgx.trusted_files.liblz4 = \"file:/usr/$(ARCH_LIBDIR)/liblz4.so.1\"\n" +
|
+ "sgx.allowed_files.aptconfd = \"file:/etc/apt/apt.conf.d\"\n"
|
||||||
"sgx.trusted_files.libsystemd = \"file:$(ARCH_LIBDIR)/libsystemd.so.0\"\n" +
|
+ "sgx.allowed_files.aptconf = \"file:/etc/apt/apt.conf\"\n"
|
||||||
"sgx.trusted_files.libselinux = \"file:$(ARCH_LIBDIR)/libselinux.so.1\"\n" +
|
+ "sgx.allowed_files.apport = \"file:/etc/default/apport\"\n" + "\n"
|
||||||
"sgx.trusted_files.libgcrypt = \"file:$(ARCH_LIBDIR)/libgcrypt.so.20\"\n" +
|
+ "# Name Service Switch (NSS) files (Glibc reads these files)\n"
|
||||||
"sgx.trusted_files.libpcre = \"file:$(ARCH_LIBDIR)/libpcre.so.3\"\n" +
|
+ "sgx.allowed_files.nsswitch = \"file:/etc/nsswitch.conf\"\n"
|
||||||
"sgx.trusted_files.libgpgerror = \"file:$(ARCH_LIBDIR)/libgpg-error.so.0\"\n" +
|
+ "sgx.allowed_files.group = \"file:/etc/group\"\n"
|
||||||
"sgx.trusted_files.libexpat = \"file:$(ARCH_LIBDIR)/libexpat.so.1\"\n" +
|
+ "sgx.allowed_files.passwd = \"file:/etc/passwd\"\n" + "\n"
|
||||||
"sgx.trusted_files.libz = \"file:$(ARCH_LIBDIR)/libz.so.1\"\n" +
|
+ "# DNS hostname resolution files (Glibc reads these files)\n"
|
||||||
"sgx.trusted_files.libz2 = \"file:$(ARCH_LIBDIR)/libbz2.so.1.0\"\n" +
|
+ "sgx.allowed_files.hostconf = \"file:/etc/host.conf\"\n"
|
||||||
"sgx.trusted_files.liblzma = \"file:$(ARCH_LIBDIR)/liblzma.so.5\"\n" +
|
+ "sgx.allowed_files.hosts = \"file:/etc/hosts\"\n"
|
||||||
"sgx.trusted_files.libmpdec = \"file:/usr/$(ARCH_LIBDIR)/libmpdec.so.2\"\n" +
|
+ "sgx.allowed_files.gaiconf = \"file:/etc/gai.conf\"\n"
|
||||||
"\n" +
|
+ "sgx.allowed_files.resolv = \"file:/etc/resolv.conf\"\n" + "\n"
|
||||||
"# Name Service Switch (NSS) libraries (Glibc dependencies)\n" +
|
+ "sgx.allowed_files.openssl = \"file:/etc/ssl/openssl.cnf\"\n" + "\n"
|
||||||
"sgx.trusted_files.libnssfiles = \"file:$(ARCH_LIBDIR)/libnss_files.so.2\"\n" +
|
+ "# System's file system table\n"
|
||||||
"sgx.trusted_files.libnsscompat = \"file:$(ARCH_LIBDIR)/libnss_compat.so.2\"\n" +
|
+ "sgx.allowed_files.fstab = \"file:/etc/fstab\"\n" + "\n"
|
||||||
"sgx.trusted_files.libnssnis = \"file:$(ARCH_LIBDIR)/libnss_nis.so.2\"\n" +
|
+ "$(NODEJS_TRUSTED_LIBS)\n" + "\n" + "# JavaScript (trusted)\n"
|
||||||
"sgx.trusted_files.libnsl = \"file:$(ARCH_LIBDIR)/libnsl.so.1\"\n" +
|
+ "sgx.allowed_files.smlib = \"file:node_modules\"\n"
|
||||||
"sgx.trusted_files.libnssmyhostname = \"file:$(ARCH_LIBDIR)/libnss_myhostname.so.2\"\n" +
|
+ "sgx.trusted_files.npminfo = \"file:package.json\"\n"
|
||||||
"sgx.trusted_files.libnssmdns = \"file:$(ARCH_LIBDIR)/libnss_mdns4_minimal.so.2\"\n" +
|
+ "sgx.trusted_files.contract = \"file:contract.js\"\n"
|
||||||
"\n" +
|
+ "sgx.trusted_files.globaljson = \"file:global.json\"\n"
|
||||||
"# Scratch space\n" +
|
+ "sgx.trusted_files.argjson = \"file:arg.json\"\n" + "\n"
|
||||||
"sgx.allowed_files.tmp = \"file:/tmp\"\n" +
|
+ "sys.insecure__allow_eventfd = 1\n" + "\n" + "sgx.remote_attestation = 1\n" + "\n"
|
||||||
"\n" +
|
+ "loader.env.LD_PRELOAD = \"libsecret_prov_attest.so\"\n"
|
||||||
"# APT config files\n" +
|
+ "loader.env.SECRET_PROVISION_CONSTRUCTOR = \"1\"\n"
|
||||||
"sgx.allowed_files.aptconfd = \"file:/etc/apt/apt.conf.d\"\n" +
|
+ "loader.env.SECRET_PROVISION_SET_PF_KEY = \"1\"\n"
|
||||||
"sgx.allowed_files.aptconf = \"file:/etc/apt/apt.conf\"\n" +
|
+ "loader.env.SECRET_PROVISION_CA_CHAIN_PATH = \"certs/test-ca-sha256.crt\"\n"
|
||||||
"sgx.allowed_files.apport = \"file:/etc/default/apport\"\n" +
|
+ "loader.env.SECRET_PROVISION_SERVERS = \"localhost:4433\"\n" + "\n"
|
||||||
"\n" +
|
+ "sgx.trusted_files.libsecretprovattest = \"file:libsecret_prov_attest.so\"\n"
|
||||||
"# Name Service Switch (NSS) files (Glibc reads these files)\n" +
|
+ "sgx.trusted_files.cachain = \"file:certs/test-ca-sha256.crt\"\n" + "\n"
|
||||||
"sgx.allowed_files.nsswitch = \"file:/etc/nsswitch.conf\"\n" +
|
+ "# Specify your SPID and linkable/unlinkable attestation policy\n"
|
||||||
"sgx.allowed_files.group = \"file:/etc/group\"\n" +
|
+ "sgx.ra_client_spid = \"DF3A8BA098E93F66CC64E8A215E98333\"\n"
|
||||||
"sgx.allowed_files.passwd = \"file:/etc/passwd\"\n" +
|
+ "sgx.ra_client_linkable = 0\n";
|
||||||
"\n" +
|
|
||||||
"# DNS hostname resolution files (Glibc reads these files)\n" +
|
|
||||||
"sgx.allowed_files.hostconf = \"file:/etc/host.conf\"\n" +
|
|
||||||
"sgx.allowed_files.hosts = \"file:/etc/hosts\"\n" +
|
|
||||||
"sgx.allowed_files.gaiconf = \"file:/etc/gai.conf\"\n" +
|
|
||||||
"sgx.allowed_files.resolv = \"file:/etc/resolv.conf\"\n" +
|
|
||||||
"\n" +
|
|
||||||
"sgx.allowed_files.openssl = \"file:/etc/ssl/openssl.cnf\"\n" +
|
|
||||||
"\n" +
|
|
||||||
"# System's file system table\n" +
|
|
||||||
"sgx.allowed_files.fstab = \"file:/etc/fstab\"\n" +
|
|
||||||
"\n" +
|
|
||||||
"$(NODEJS_TRUSTED_LIBS)\n" +
|
|
||||||
"\n" +
|
|
||||||
"# JavaScript (trusted)\n" +
|
|
||||||
"sgx.allowed_files.smlib = \"file:node_modules\"\n" +
|
|
||||||
"sgx.trusted_files.npminfo = \"file:package.json\"\n" +
|
|
||||||
"sgx.trusted_files.contract = \"file:contract.js\"\n" +
|
|
||||||
"sgx.trusted_files.globaljson = \"file:global.json\"\n" +
|
|
||||||
"sgx.trusted_files.argjson = \"file:arg.json\"\n" +
|
|
||||||
"\n" +
|
|
||||||
"sys.insecure__allow_eventfd = 1\n" +
|
|
||||||
"\n" +
|
|
||||||
"sgx.remote_attestation = 1\n" +
|
|
||||||
"\n" +
|
|
||||||
"loader.env.LD_PRELOAD = \"libsecret_prov_attest.so\"\n" +
|
|
||||||
"loader.env.SECRET_PROVISION_CONSTRUCTOR = \"1\"\n" +
|
|
||||||
"loader.env.SECRET_PROVISION_SET_PF_KEY = \"1\"\n" +
|
|
||||||
"loader.env.SECRET_PROVISION_CA_CHAIN_PATH = \"certs/test-ca-sha256.crt\"\n" +
|
|
||||||
"loader.env.SECRET_PROVISION_SERVERS = \"localhost:4433\"\n" +
|
|
||||||
"\n" +
|
|
||||||
"sgx.trusted_files.libsecretprovattest = \"file:libsecret_prov_attest.so\"\n" +
|
|
||||||
"sgx.trusted_files.cachain = \"file:certs/test-ca-sha256.crt\"\n" +
|
|
||||||
"\n" +
|
|
||||||
"# Specify your SPID and linkable/unlinkable attestation policy\n" +
|
|
||||||
"sgx.ra_client_spid = \"DF3A8BA098E93F66CC64E8A215E98333\"\n" +
|
|
||||||
"sgx.ra_client_linkable = 0\n";
|
|
||||||
// add secret servers
|
// add secret servers
|
||||||
manifestStr += "loader.env.SECRET_PROVISION_CC_SERVERS = ";
|
manifestStr += "loader.env.SECRET_PROVISION_CC_SERVERS = ";
|
||||||
Object resultStr = engine.invokeFunction(
|
Object resultStr = engine.invokeFunction("getAllSecret", "", input.getRequester(),
|
||||||
"getAllSecret",
|
|
||||||
"",
|
|
||||||
input.getRequester(),
|
|
||||||
input.getRequesterDOI());
|
input.getRequesterDOI());
|
||||||
Map<String, String> resultMap = JsonUtil.fromJson(resultStr.toString(), MapType);
|
Map<String, String> resultMap = JsonUtil.fromJson(resultStr.toString(), MapType);
|
||||||
Map<String, String> serverMap = JsonUtil.fromJson(resultMap.get("result"), MapType);
|
Map<String, String> serverMap = JsonUtil.fromJson(resultMap.get("result"), MapType);
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package org.bdware.sc.engine;
|
package org.bdware.sc.engine;
|
||||||
|
|
||||||
import com.google.gson.JsonElement;
|
|
||||||
import com.google.gson.JsonPrimitive;
|
import com.google.gson.JsonPrimitive;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
@ -137,13 +136,9 @@ public class DesktopEngine extends JSEngine {
|
|||||||
syncUtil = new SyncMechUtil(this);
|
syncUtil = new SyncMechUtil(this);
|
||||||
ClassLoader ccl = Thread.currentThread().getContextClassLoader();
|
ClassLoader ccl = Thread.currentThread().getContextClassLoader();
|
||||||
ccl = (ccl == null) ? NashornScriptEngineFactory.class.getClassLoader() : ccl;
|
ccl = (ccl == null) ? NashornScriptEngineFactory.class.getClassLoader() : ccl;
|
||||||
String[] args = new String[]{"--loader-per-compile=false", "-strict=false"};
|
String[] args = new String[] {"--loader-per-compile=false", "-strict=false"};
|
||||||
classLoader = new YJSClassLoader(ccl, new YJSFilter());
|
classLoader = new YJSClassLoader(ccl, new YJSFilter());
|
||||||
engine =
|
engine = (NashornScriptEngine) new NashornScriptEngineFactory().getScriptEngine(args, // "--print-ast",
|
||||||
(NashornScriptEngine)
|
|
||||||
new NashornScriptEngineFactory()
|
|
||||||
.getScriptEngine(
|
|
||||||
args, // "--print-ast",
|
|
||||||
// "true",
|
// "true",
|
||||||
// "-d=/Users/huaqiancai/Downloads/dumpedClz",
|
// "-d=/Users/huaqiancai/Downloads/dumpedClz",
|
||||||
// "--trace-callsites=enterexit"
|
// "--trace-callsites=enterexit"
|
||||||
@ -157,17 +152,12 @@ public class DesktopEngine extends JSEngine {
|
|||||||
// engine = (NashornScriptEngine) new
|
// engine = (NashornScriptEngine) new
|
||||||
// NashornScriptEngineFactory().getScriptEngine(new YJSFilter());
|
// NashornScriptEngineFactory().getScriptEngine(new YJSFilter());
|
||||||
if (_with_init_script) {
|
if (_with_init_script) {
|
||||||
InputStream in =
|
InputStream in = DesktopEngine.class.getClassLoader()
|
||||||
DesktopEngine.class
|
|
||||||
.getClassLoader()
|
|
||||||
.getResourceAsStream("org/bdware/sc/engine/yancloud_desktop.js");
|
.getResourceAsStream("org/bdware/sc/engine/yancloud_desktop.js");
|
||||||
assert in != null;
|
assert in != null;
|
||||||
InputStreamReader streamReader = new InputStreamReader(in);
|
InputStreamReader streamReader = new InputStreamReader(in);
|
||||||
engine.getContext()
|
engine.getContext().setAttribute(ScriptEngine.FILENAME,
|
||||||
.setAttribute(
|
"org/bdware/sc/engine/yancloud_desktop.js", ScriptContext.ENGINE_SCOPE);
|
||||||
ScriptEngine.FILENAME,
|
|
||||||
"org/bdware/sc/engine/yancloud_desktop.js",
|
|
||||||
ScriptContext.ENGINE_SCOPE);
|
|
||||||
engine.eval(streamReader);
|
engine.eval(streamReader);
|
||||||
}
|
}
|
||||||
global = engine.getNashornGlobal();
|
global = engine.getNashornGlobal();
|
||||||
@ -195,10 +185,7 @@ public class DesktopEngine extends JSEngine {
|
|||||||
yancloud_desktop.append(UtilRegistry.getInitStr(str, false));
|
yancloud_desktop.append(UtilRegistry.getInitStr(str, false));
|
||||||
}
|
}
|
||||||
// LOGGER.debug("[initScript] " + yancloud_desktop);
|
// LOGGER.debug("[initScript] " + yancloud_desktop);
|
||||||
engine.getContext()
|
engine.getContext().setAttribute(ScriptEngine.FILENAME, yancloud_desktop.toString(),
|
||||||
.setAttribute(
|
|
||||||
ScriptEngine.FILENAME,
|
|
||||||
yancloud_desktop.toString(),
|
|
||||||
ScriptContext.ENGINE_SCOPE);
|
ScriptContext.ENGINE_SCOPE);
|
||||||
engine.eval(yancloud_desktop.toString());
|
engine.eval(yancloud_desktop.toString());
|
||||||
} catch (ScriptException e) {
|
} catch (ScriptException e) {
|
||||||
@ -252,11 +239,11 @@ public class DesktopEngine extends JSEngine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ContractResult loadContract(
|
public ContractResult loadContract(Contract contract, ContractNode contractNode,
|
||||||
Contract contract, ContractNode contractNode, boolean isInsnLimit) {
|
boolean isInsnLimit) {
|
||||||
cn = contractNode;
|
cn = contractNode;
|
||||||
engine.getContext()
|
engine.getContext().setAttribute(ScriptEngine.FILENAME, ScriptFileName,
|
||||||
.setAttribute(ScriptEngine.FILENAME, ScriptFileName, ScriptContext.ENGINE_SCOPE);
|
ScriptContext.ENGINE_SCOPE);
|
||||||
try {
|
try {
|
||||||
setPermission(cn.getPermission());
|
setPermission(cn.getPermission());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@ -266,10 +253,7 @@ public class DesktopEngine extends JSEngine {
|
|||||||
for (FunctionNode fun : contractNode.getFunctions())
|
for (FunctionNode fun : contractNode.getFunctions())
|
||||||
try {
|
try {
|
||||||
String str = fun.plainText();
|
String str = fun.plainText();
|
||||||
engine.getContext()
|
engine.getContext().setAttribute(ScriptEngine.FILENAME, fun.getFileName(),
|
||||||
.setAttribute(
|
|
||||||
ScriptEngine.FILENAME,
|
|
||||||
fun.getFileName(),
|
|
||||||
ScriptContext.ENGINE_SCOPE);
|
ScriptContext.ENGINE_SCOPE);
|
||||||
compileFunction(fun, str, isInsnLimit);
|
compileFunction(fun, str, isInsnLimit);
|
||||||
} catch (ScriptException e) {
|
} catch (ScriptException e) {
|
||||||
@ -280,7 +264,8 @@ public class DesktopEngine extends JSEngine {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return new ContractResult(Status.Error, new JsonPrimitive(bo.toString()));
|
return new ContractResult(Status.Error, new JsonPrimitive(bo.toString()));
|
||||||
}
|
}
|
||||||
LOGGER.debug(JsonUtil.toJson(contractNode.events) + "\n\t" + JsonUtil.toJson(contractNode.logs));
|
LOGGER.debug(
|
||||||
|
JsonUtil.toJson(contractNode.events) + "\n\t" + JsonUtil.toJson(contractNode.logs));
|
||||||
for (String topic : contractNode.events.keySet()) {
|
for (String topic : contractNode.events.keySet()) {
|
||||||
compileEventFunction(topic, topic, contractNode.events.get(topic));
|
compileEventFunction(topic, topic, contractNode.events.get(topic));
|
||||||
}
|
}
|
||||||
@ -311,20 +296,16 @@ public class DesktopEngine extends JSEngine {
|
|||||||
try {
|
try {
|
||||||
String str;
|
String str;
|
||||||
if (REventSemantics.AT_LEAST_ONCE.equals(semantics)) {
|
if (REventSemantics.AT_LEAST_ONCE.equals(semantics)) {
|
||||||
str =
|
str = String.format("function %s(arg) { YancloudUtil.pubEvent(\"%s\", arg); }",
|
||||||
String.format(
|
|
||||||
"function %s(arg) { YancloudUtil.pubEvent(\"%s\", arg); }",
|
|
||||||
name, topic);
|
name, topic);
|
||||||
} else {
|
} else {
|
||||||
str =
|
str = String.format(
|
||||||
String.format(
|
|
||||||
"function %s(arg) { YancloudUtil.pubEventConstraint(\"%s\", arg, \"%s\"); }",
|
"function %s(arg) { YancloudUtil.pubEventConstraint(\"%s\", arg, \"%s\"); }",
|
||||||
name, topic, semantics.name());
|
name, topic, semantics.name());
|
||||||
}
|
}
|
||||||
compileFunction(null, str, false);
|
compileFunction(null, str, false);
|
||||||
LOGGER.debug("compile function " + name + " success!");
|
LOGGER.debug("compile function " + name + " success!");
|
||||||
str =
|
str = String.format(
|
||||||
String.format(
|
|
||||||
"function %ss(arg0, arg1) { YancloudUtil.pubEventConstraint(\"%s\", arg0, arg1); }",
|
"function %ss(arg0, arg1) { YancloudUtil.pubEventConstraint(\"%s\", arg0, arg1); }",
|
||||||
name, topic);
|
name, topic);
|
||||||
compileFunction(null, str, false);
|
compileFunction(null, str, false);
|
||||||
@ -406,7 +387,8 @@ public class DesktopEngine extends JSEngine {
|
|||||||
//
|
//
|
||||||
// return new ContractResult(Status.Success, new JsonPrimitive(""));
|
// return new ContractResult(Status.Success, new JsonPrimitive(""));
|
||||||
// }
|
// }
|
||||||
private void compileFunction(FunctionNode functionNode, ScriptObjectMirror sf, boolean instrumentBranch) {
|
private void compileFunction(FunctionNode functionNode, ScriptObjectMirror sf,
|
||||||
|
boolean instrumentBranch) {
|
||||||
Global oldGlobal = Context.getGlobal();
|
Global oldGlobal = Context.getGlobal();
|
||||||
boolean globalChanged = (oldGlobal != global);
|
boolean globalChanged = (oldGlobal != global);
|
||||||
try {
|
try {
|
||||||
@ -423,7 +405,8 @@ public class DesktopEngine extends JSEngine {
|
|||||||
f.setAccessible(true);
|
f.setAccessible(true);
|
||||||
ScriptFunctionData scriptFunctioNData = (ScriptFunctionData) f.get(scriptFunction);
|
ScriptFunctionData scriptFunctioNData = (ScriptFunctionData) f.get(scriptFunction);
|
||||||
Object scope = scriptFunction.getScope();
|
Object scope = scriptFunction.getScope();
|
||||||
Method getGeneric = ScriptFunctionData.class.getDeclaredMethod("getGenericInvoker", ScriptObject.class);
|
Method getGeneric = ScriptFunctionData.class.getDeclaredMethod("getGenericInvoker",
|
||||||
|
ScriptObject.class);
|
||||||
getGeneric.setAccessible(true);
|
getGeneric.setAccessible(true);
|
||||||
MethodHandle methodHandle = (MethodHandle) getGeneric.invoke(scriptFunctioNData, scope);
|
MethodHandle methodHandle = (MethodHandle) getGeneric.invoke(scriptFunctioNData, scope);
|
||||||
if (methodHandle.getClass() != Class.forName("java.lang.invoke.DirectMethodHandle")) {
|
if (methodHandle.getClass() != Class.forName("java.lang.invoke.DirectMethodHandle")) {
|
||||||
@ -441,17 +424,19 @@ public class DesktopEngine extends JSEngine {
|
|||||||
Class clazz2 = (Class) clazz.get(memberName);
|
Class clazz2 = (Class) clazz.get(memberName);
|
||||||
if (functionNode != null)
|
if (functionNode != null)
|
||||||
functionNode.compiledClazz = clazz2;
|
functionNode.compiledClazz = clazz2;
|
||||||
//functionNode==null --> event functions
|
// functionNode==null --> event functions
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} finally {
|
} finally {
|
||||||
if (globalChanged) Context.setGlobal(oldGlobal);
|
if (globalChanged)
|
||||||
|
Context.setGlobal(oldGlobal);
|
||||||
Context.TRACEIF = false;
|
Context.TRACEIF = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void compileFunction(FunctionNode functionNode, String snippet, boolean instrumentBranch) throws ScriptException {
|
public void compileFunction(FunctionNode functionNode, String snippet, boolean instrumentBranch)
|
||||||
|
throws ScriptException {
|
||||||
compileFunction(functionNode, (ScriptObjectMirror) engine.eval(snippet), instrumentBranch);
|
compileFunction(functionNode, (ScriptObjectMirror) engine.eval(snippet), instrumentBranch);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -481,8 +466,7 @@ public class DesktopEngine extends JSEngine {
|
|||||||
JavaScriptEntry.msgList = new ArrayList<>();
|
JavaScriptEntry.msgList = new ArrayList<>();
|
||||||
FunctionNode fun = cn.getFunction(input.getAction());
|
FunctionNode fun = cn.getFunction(input.getAction());
|
||||||
if (fun == null) {
|
if (fun == null) {
|
||||||
return new ContractResult(
|
return new ContractResult(Status.Exception,
|
||||||
Status.Exception,
|
|
||||||
new JsonPrimitive("Action " + input.getAction() + " is not exists"));
|
new JsonPrimitive("Action " + input.getAction() + " is not exists"));
|
||||||
}
|
}
|
||||||
ProgramPointCounter ppc = null;
|
ProgramPointCounter ppc = null;
|
||||||
@ -499,23 +483,14 @@ public class DesktopEngine extends JSEngine {
|
|||||||
HashMap<String, Long> ppCountMap = evaluatesAnalysis(input.getAction(), functions);
|
HashMap<String, Long> ppCountMap = evaluatesAnalysis(input.getAction(), functions);
|
||||||
Long extraGas = getExtraGas(fun.getCost().getExtraGas(), input);
|
Long extraGas = getExtraGas(fun.getCost().getExtraGas(), input);
|
||||||
bo = new ByteArrayOutputStream();
|
bo = new ByteArrayOutputStream();
|
||||||
ppc =
|
ppc = new ProgramPointCounter(bo, previous.getCp(), Long.MAX_VALUE, functionIndex,
|
||||||
new ProgramPointCounter(
|
input.getGasLimit(), extraGas, input.getAction(), ppCountMap);
|
||||||
bo,
|
|
||||||
previous.getCp(),
|
|
||||||
Long.MAX_VALUE,
|
|
||||||
functionIndex,
|
|
||||||
input.getGasLimit(),
|
|
||||||
extraGas,
|
|
||||||
input.getAction(),
|
|
||||||
ppCountMap);
|
|
||||||
this.redirectTracePS(ppc);
|
this.redirectTracePS(ppc);
|
||||||
}
|
}
|
||||||
if (fun.isExport() ||
|
if (fun.isExport() ||
|
||||||
// if the function has been registered as event handler
|
// if the function has been registered as event handler
|
||||||
(fun.isHandler() &&
|
(fun.isHandler() && null != input.getRequester()
|
||||||
null != input.getRequester() &&
|
&& input.getRequester().startsWith("event"))) {
|
||||||
input.getRequester().startsWith("event"))) {
|
|
||||||
Object ret;
|
Object ret;
|
||||||
if (fun.isView()) {
|
if (fun.isView()) {
|
||||||
ret = executeWithoutLock(fun, input, null);
|
ret = executeWithoutLock(fun, input, null);
|
||||||
@ -525,8 +500,10 @@ public class DesktopEngine extends JSEngine {
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//System.out.println("[DesktopEngine MaskConfig]"+ContractProcess.instance.getProjectConfig().getMaskConfig().config.toString());
|
// System.out.println("[DesktopEngine
|
||||||
ContractResult contractRes = new ContractResult(Status.Success, JSONTool.convertMirrorToJson(ret));
|
// MaskConfig]"+ContractProcess.instance.getProjectConfig().getMaskConfig().config.toString());
|
||||||
|
ContractResult contractRes =
|
||||||
|
new ContractResult(Status.Success, JSONTool.convertMirrorToJson(ret));
|
||||||
if (ppc != null) {
|
if (ppc != null) {
|
||||||
contractRes.extraGas = ppc.extraGas;
|
contractRes.extraGas = ppc.extraGas;
|
||||||
contractRes.executionGas = ppc.cost;
|
contractRes.executionGas = ppc.cost;
|
||||||
@ -568,16 +545,13 @@ public class DesktopEngine extends JSEngine {
|
|||||||
} else {
|
} else {
|
||||||
// return new ContractResult(Status.Exception, "Action " + input.getAction() + "
|
// return new ContractResult(Status.Exception, "Action " + input.getAction() + "
|
||||||
// is not exported!");
|
// is not exported!");
|
||||||
return new ContractResult(
|
return new ContractResult(Status.Exception,
|
||||||
Status.Exception,
|
|
||||||
new JsonPrimitive("Action " + input.getAction() + " is not exported!"));
|
new JsonPrimitive("Action " + input.getAction() + " is not exported!"));
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (ScriptReturnException e) {
|
} catch (ScriptReturnException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return new ContractResult(
|
return new ContractResult(Status.Exception, e.message);
|
||||||
Status.Exception,
|
|
||||||
e.message);
|
|
||||||
} catch (ScriptException e) {
|
} catch (ScriptException e) {
|
||||||
Throwable cause = e.getCause();
|
Throwable cause = e.getCause();
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@ -588,26 +562,25 @@ public class DesktopEngine extends JSEngine {
|
|||||||
e.printStackTrace(ps);
|
e.printStackTrace(ps);
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
if (e.getCause() != null && e.getCause() instanceof ScriptException) {
|
if (e.getCause() != null && e.getCause() instanceof ScriptException) {
|
||||||
return new ContractResult(
|
return new ContractResult(Status.Exception, new JsonPrimitive(
|
||||||
Status.Exception,
|
|
||||||
new JsonPrimitive(
|
|
||||||
extractException(bo1.toString(), extract(cn, e.getCause()))));
|
extractException(bo1.toString(), extract(cn, e.getCause()))));
|
||||||
} else {
|
} else {
|
||||||
return new ContractResult(
|
return new ContractResult(Status.Exception,
|
||||||
Status.Exception,
|
|
||||||
new JsonPrimitive(extractException(bo1.toString(), extract(cn, e))));
|
new JsonPrimitive(extractException(bo1.toString(), extract(cn, e))));
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
this.redirectTracePS(previous);
|
this.redirectTracePS(previous);
|
||||||
if (globalChanged) Context.setGlobal(oldGlobal);
|
if (globalChanged)
|
||||||
|
Context.setGlobal(oldGlobal);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Object executeWithoutLock(FunctionNode fun, ContractRequest input, Object injectedArg) throws ScriptException, NoSuchMethodException {
|
public Object executeWithoutLock(FunctionNode fun, ContractRequest input, Object injectedArg)
|
||||||
|
throws ScriptException, NoSuchMethodException {
|
||||||
// long start = System.currentTimeMillis();
|
// long start = System.currentTimeMillis();
|
||||||
ArgPacks argPacks = new ArgPacks(input, input.getArg(), null);
|
ArgPacks argPacks = new ArgPacks(input, input.getArg(), null);
|
||||||
if(injectedArg != null) {
|
if (injectedArg != null) {
|
||||||
argPacks.arg = injectedArg;
|
argPacks.arg = injectedArg;
|
||||||
}
|
}
|
||||||
for (AnnotationHook handler : fun.beforeExecutionAnnotations()) {
|
for (AnnotationHook handler : fun.beforeExecutionAnnotations()) {
|
||||||
@ -616,19 +589,15 @@ public class DesktopEngine extends JSEngine {
|
|||||||
|
|
||||||
// actually invoke!
|
// actually invoke!
|
||||||
if (argPacks.ret == null) {
|
if (argPacks.ret == null) {
|
||||||
argPacks.ret =
|
argPacks.ret = engine.invokeFunction(input.getAction(),
|
||||||
engine.invokeFunction(
|
(fun.isHandler() ? JsonUtil.fromJson(input.getArg(), Event.class)
|
||||||
input.getAction(),
|
|
||||||
(fun.isHandler()
|
|
||||||
? JsonUtil.fromJson(input.getArg(), Event.class)
|
|
||||||
: JSONTool.convertJsonElementToMirror(argPacks.arg)),
|
: JSONTool.convertJsonElementToMirror(argPacks.arg)),
|
||||||
input.getRequester(),
|
input.getRequester(), input.getRequesterDOI());
|
||||||
input.getRequesterDOI());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (AnnotationHook handler : fun.afterExecutionAnnotations()) {
|
for (AnnotationHook handler : fun.afterExecutionAnnotations()) {
|
||||||
//Mask在after裏面
|
// Mask在after裏面
|
||||||
//System.out.println("afterHook"+contract.Mask);
|
// System.out.println("afterHook"+contract.Mask);
|
||||||
argPacks = handler.handle(this, argPacks);
|
argPacks = handler.handle(this, argPacks);
|
||||||
}
|
}
|
||||||
return argPacks.ret;
|
return argPacks.ret;
|
||||||
@ -661,8 +630,7 @@ public class DesktopEngine extends JSEngine {
|
|||||||
for (String function : functions) {
|
for (String function : functions) {
|
||||||
MethodNode mn = methods.get(function);
|
MethodNode mn = methods.get(function);
|
||||||
if (mn != null) {
|
if (mn != null) {
|
||||||
CFGraph cfg =
|
CFGraph cfg = new CFGraph(mn) {
|
||||||
new CFGraph(mn) {
|
|
||||||
@Override
|
@Override
|
||||||
public BasicBlock getBasicBlock(int id) {
|
public BasicBlock getBasicBlock(int id) {
|
||||||
return new BasicBlock(id);
|
return new BasicBlock(id);
|
||||||
@ -686,15 +654,15 @@ public class DesktopEngine extends JSEngine {
|
|||||||
flag++;
|
flag++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* for (Map.Entry<String, Long> map : PPCount.functionSumGas.entrySet()) {
|
/*
|
||||||
if (map.getKey().contains(getFunction) && map.getKey().contains("true")) {
|
* for (Map.Entry<String, Long> map : PPCount.functionSumGas.entrySet()) { if
|
||||||
System.out.println("[合约方法pub中条件循环为true时:]" + map.getValue());
|
* (map.getKey().contains(getFunction) && map.getKey().contains("true")) {
|
||||||
} else if (map.getKey().contains(getFunction) && map.getKey().contains("false")) {
|
* System.out.println("[合约方法pub中条件循环为true时:]" + map.getValue()); } else if
|
||||||
System.out.println("[合约方法pub中条件循环为false时:]" + map.getValue());
|
* (map.getKey().contains(getFunction) && map.getKey().contains("false")) {
|
||||||
} else if (map.getKey().contains(getFunction)) {
|
* System.out.println("[合约方法pub中条件循环为false时:]" + map.getValue()); } else if
|
||||||
System.out.println("[合约方法pub中其他语句消耗:]" + map.getValue());
|
* (map.getKey().contains(getFunction)) { System.out.println("[合约方法pub中其他语句消耗:]" +
|
||||||
}
|
* map.getValue()); } }
|
||||||
}*/
|
*/
|
||||||
return ppCountMap;
|
return ppCountMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -704,11 +672,7 @@ public class DesktopEngine extends JSEngine {
|
|||||||
return 0L;
|
return 0L;
|
||||||
}
|
}
|
||||||
Invocable cal = engine;
|
Invocable cal = engine;
|
||||||
Object ret =
|
Object ret = cal.invokeFunction(costFunction, input.getArg(), input.getRequester(),
|
||||||
cal.invokeFunction(
|
|
||||||
costFunction,
|
|
||||||
input.getArg(),
|
|
||||||
input.getRequester(),
|
|
||||||
input.getRequesterDOI());
|
input.getRequesterDOI());
|
||||||
if (ret != null && StringUtils.isNumeric(ret.toString())) {
|
if (ret != null && StringUtils.isNumeric(ret.toString())) {
|
||||||
return Long.parseLong(ret.toString());
|
return Long.parseLong(ret.toString());
|
||||||
@ -765,15 +729,16 @@ public class DesktopEngine extends JSEngine {
|
|||||||
if (actLine != -1) {
|
if (actLine != -1) {
|
||||||
actLine += line - 1;
|
actLine += line - 1;
|
||||||
}
|
}
|
||||||
message =
|
message = message.replaceAll("at line number " + e.getLineNumber(),
|
||||||
message.replaceAll(
|
"at line number " + (actLine));
|
||||||
"at line number " + e.getLineNumber(), "at line number " + (actLine));
|
|
||||||
if (fun.getFileName() != null)
|
if (fun.getFileName() != null)
|
||||||
message = message.replace("in contract_main.yjs", "in " + fun.getFileName());
|
message = message.replace("in contract_main.yjs", "in " + fun.getFileName());
|
||||||
content.append(message);
|
content.append(message);
|
||||||
content.append("(");
|
content.append("(");
|
||||||
if (fun.functionName != null) content.append(fun.functionName);
|
if (fun.functionName != null)
|
||||||
else content.append("contract_main.yjs");
|
content.append(fun.functionName);
|
||||||
|
else
|
||||||
|
content.append("contract_main.yjs");
|
||||||
content.append(":");
|
content.append(":");
|
||||||
|
|
||||||
content.append(actLine);
|
content.append(actLine);
|
||||||
@ -792,16 +757,14 @@ public class DesktopEngine extends JSEngine {
|
|||||||
String methodName = element.getMethodName();
|
String methodName = element.getMethodName();
|
||||||
String fileName = element.getFileName();
|
String fileName = element.getFileName();
|
||||||
|
|
||||||
if (fileName.endsWith(".java")) continue;
|
if (fileName.endsWith(".java"))
|
||||||
|
continue;
|
||||||
if (c.isBundle()) {
|
if (c.isBundle()) {
|
||||||
fileName = fixFile(c, methodName);
|
fileName = fixFile(c, methodName);
|
||||||
}
|
}
|
||||||
if (fileName.equals("--")) continue;
|
if (fileName.equals("--"))
|
||||||
ret.add(
|
continue;
|
||||||
String.format(
|
ret.add(String.format("at %s(%s:%d)", methodName, fileName,
|
||||||
"at %s(%s:%d)",
|
|
||||||
methodName,
|
|
||||||
fileName,
|
|
||||||
(fixLine(c, methodName) + element.getLineNumber())));
|
(fixLine(c, methodName) + element.getLineNumber())));
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
@ -918,13 +881,13 @@ public class DesktopEngine extends JSEngine {
|
|||||||
}
|
}
|
||||||
if (entry.getName().endsWith(".so") || entry.getName().endsWith(".so.1")) {
|
if (entry.getName().endsWith(".so") || entry.getName().endsWith(".so.1")) {
|
||||||
System.out.println("unzip library:" + entry.getName().replaceAll(".*/", ""));
|
System.out.println("unzip library:" + entry.getName().replaceAll(".*/", ""));
|
||||||
loader.unzipLibrary(
|
loader.unzipLibrary(zf.getInputStream(entry),
|
||||||
zf.getInputStream(entry), entry.getName().replaceAll(".*/", ""));
|
entry.getName().replaceAll(".*/", ""));
|
||||||
}
|
}
|
||||||
if (HardwareInfo.type == OSType.mac && entry.getName().endsWith(".dylib")) {
|
if (HardwareInfo.type == OSType.mac && entry.getName().endsWith(".dylib")) {
|
||||||
System.out.println("unzip library:" + entry.getName().replaceAll(".*/", ""));
|
System.out.println("unzip library:" + entry.getName().replaceAll(".*/", ""));
|
||||||
loader.unzipLibrary(
|
loader.unzipLibrary(zf.getInputStream(entry),
|
||||||
zf.getInputStream(entry), entry.getName().replaceAll(".*/", ""));
|
entry.getName().replaceAll(".*/", ""));
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
@ -50,11 +50,14 @@ public class JSONTool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static JsonElement convertMirrorToJsonInternal(Object obj, Set<Object> recorded) {
|
private static JsonElement convertMirrorToJsonInternal(Object obj, Set<Object> recorded) {
|
||||||
if (recorded.contains(obj)) return JsonNull.INSTANCE;
|
if (recorded.contains(obj))
|
||||||
if (obj == null) return JsonNull.INSTANCE;
|
return JsonNull.INSTANCE;
|
||||||
|
if (obj == null)
|
||||||
|
return JsonNull.INSTANCE;
|
||||||
if (obj.getClass() == wrp.jdk.nashorn.internal.runtime.Undefined.class)
|
if (obj.getClass() == wrp.jdk.nashorn.internal.runtime.Undefined.class)
|
||||||
return JsonNull.INSTANCE;
|
return JsonNull.INSTANCE;
|
||||||
if (obj instanceof JsonElement) return (JsonElement) obj;
|
if (obj instanceof JsonElement)
|
||||||
|
return (JsonElement) obj;
|
||||||
if (obj.getClass().isArray()) {
|
if (obj.getClass().isArray()) {
|
||||||
Object[] arr = (Object[]) obj;
|
Object[] arr = (Object[]) obj;
|
||||||
recorded.add(obj);
|
recorded.add(obj);
|
||||||
|
@ -128,17 +128,18 @@ public class SyncMechUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* memory的操作
|
* memory的操作 无需startFlag就可以使用memory的操作
|
||||||
* 无需startFlag就可以使用memory的操作
|
|
||||||
*/
|
*/
|
||||||
public synchronized String dumpMemory(String path) {
|
public synchronized String dumpMemory(String path) {
|
||||||
if (memoryDumpUtil == null) memoryDumpUtil = new MemoryDumpUtil(engine.engine);
|
if (memoryDumpUtil == null)
|
||||||
|
memoryDumpUtil = new MemoryDumpUtil(engine.engine);
|
||||||
return memoryDumpUtil.dumpMemory(path, true);
|
return memoryDumpUtil.dumpMemory(path, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized String dumpMemory(String path, boolean stateful) {
|
public synchronized String dumpMemory(String path, boolean stateful) {
|
||||||
LOGGER.info("dumpMemroy : stateful=" + stateful);
|
LOGGER.info("dumpMemroy : stateful=" + stateful);
|
||||||
if (memoryDumpUtil == null) memoryDumpUtil = new MemoryDumpUtil(engine.engine);
|
if (memoryDumpUtil == null)
|
||||||
|
memoryDumpUtil = new MemoryDumpUtil(engine.engine);
|
||||||
return memoryDumpUtil.dumpMemory(path, stateful);
|
return memoryDumpUtil.dumpMemory(path, stateful);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -210,7 +211,8 @@ public class SyncMechUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void changeCurrType(SyncType t) {
|
public void changeCurrType(SyncType t) {
|
||||||
if (t == currType) return;
|
if (t == currType)
|
||||||
|
return;
|
||||||
|
|
||||||
// finASyncRecord();
|
// finASyncRecord();
|
||||||
currType = t;
|
currType = t;
|
||||||
@ -226,7 +228,8 @@ public class SyncMechUtil {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Memory:
|
case Memory:
|
||||||
if (memoryDumpUtil == null) memoryDumpUtil = new MemoryDumpUtil(engine.engine);
|
if (memoryDumpUtil == null)
|
||||||
|
memoryDumpUtil = new MemoryDumpUtil(engine.engine);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -256,7 +259,8 @@ public class SyncMechUtil {
|
|||||||
* Trans操作
|
* Trans操作
|
||||||
*/
|
*/
|
||||||
public synchronized String redo(String path) {
|
public synchronized String redo(String path) {
|
||||||
if (transRecoverUtil == null) transRecoverUtil = new TransRecoverUtil(engine);
|
if (transRecoverUtil == null)
|
||||||
|
transRecoverUtil = new TransRecoverUtil(engine);
|
||||||
|
|
||||||
// 先清空,否则会重复执行一些trans
|
// 先清空,否则会重复执行一些trans
|
||||||
if (transRecoverUtil.transRecords != null && !transRecoverUtil.transRecords.isEmpty())
|
if (transRecoverUtil.transRecords != null && !transRecoverUtil.transRecords.isEmpty())
|
||||||
@ -264,7 +268,8 @@ public class SyncMechUtil {
|
|||||||
|
|
||||||
// 某一次检查点之后没有transRecords
|
// 某一次检查点之后没有transRecords
|
||||||
File file = new File(path);
|
File file = new File(path);
|
||||||
if (!file.exists()) return "success";
|
if (!file.exists())
|
||||||
|
return "success";
|
||||||
|
|
||||||
transRecoverUtil.setTraceRecords(path);
|
transRecoverUtil.setTraceRecords(path);
|
||||||
transRecoverUtil.recoverFromTransRecord();
|
transRecoverUtil.recoverFromTransRecord();
|
||||||
|
@ -6,9 +6,8 @@ import javax.script.ScriptEngine;
|
|||||||
|
|
||||||
public class TestClassFilter {
|
public class TestClassFilter {
|
||||||
public TestClassFilter() {
|
public TestClassFilter() {
|
||||||
final String script = "print(java.lang.System.getProperty(\"java.home\"));" +
|
final String script = "print(java.lang.System.getProperty(\"java.home\"));"
|
||||||
"print(\"Create file variable\");" +
|
+ "print(\"Create file variable\");" + "var File = Java.type(\"java.io.File\");";
|
||||||
"var File = Java.type(\"java.io.File\");";
|
|
||||||
NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
|
NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
|
||||||
ScriptEngine engine = factory.getScriptEngine(new YJSFilter());
|
ScriptEngine engine = factory.getScriptEngine(new YJSFilter());
|
||||||
try {
|
try {
|
||||||
|
@ -19,7 +19,7 @@ public class YJSClassLoader extends URLClassLoader {
|
|||||||
List<String> toLoad = new ArrayList<>();
|
List<String> toLoad = new ArrayList<>();
|
||||||
|
|
||||||
public YJSClassLoader(ClassLoader parent, ClassFilter cf) {
|
public YJSClassLoader(ClassLoader parent, ClassFilter cf) {
|
||||||
super(new URL[]{}, parent);
|
super(new URL[] {}, parent);
|
||||||
classFilter = cf;
|
classFilter = cf;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -50,7 +50,7 @@ public class YJSClassLoader extends URLClassLoader {
|
|||||||
ByteArrayOutputStream bo = new ByteArrayOutputStream();
|
ByteArrayOutputStream bo = new ByteArrayOutputStream();
|
||||||
byte[] buff = new byte[1024];
|
byte[] buff = new byte[1024];
|
||||||
|
|
||||||
for (int len = 0; (len = in.read(buff)) > 0; ) {
|
for (int len = 0; (len = in.read(buff)) > 0;) {
|
||||||
bo.write(buff, 0, len);
|
bo.write(buff, 0, len);
|
||||||
}
|
}
|
||||||
return bo.toByteArray();
|
return bo.toByteArray();
|
||||||
@ -63,7 +63,8 @@ public class YJSClassLoader extends URLClassLoader {
|
|||||||
public String unzipLibrary(InputStream inputStream, String name) {
|
public String unzipLibrary(InputStream inputStream, String name) {
|
||||||
try {
|
try {
|
||||||
if (libDir == null) {
|
if (libDir == null) {
|
||||||
libDir = new File(System.getProperty("java.io.tmpdir"), "yjscontract_" + System.currentTimeMillis());
|
libDir = new File(System.getProperty("java.io.tmpdir"),
|
||||||
|
"yjscontract_" + System.currentTimeMillis());
|
||||||
libDir.mkdirs();
|
libDir.mkdirs();
|
||||||
}
|
}
|
||||||
File f = new File(libDir, name);
|
File f = new File(libDir, name);
|
||||||
@ -71,7 +72,7 @@ public class YJSClassLoader extends URLClassLoader {
|
|||||||
toLoad.add(f.getAbsolutePath());
|
toLoad.add(f.getAbsolutePath());
|
||||||
FileOutputStream fout = new FileOutputStream(f);
|
FileOutputStream fout = new FileOutputStream(f);
|
||||||
byte[] buff = new byte[1024 * 100];
|
byte[] buff = new byte[1024 * 100];
|
||||||
for (int k = 0; (k = inputStream.read(buff)) > 0; ) {
|
for (int k = 0; (k = inputStream.read(buff)) > 0;) {
|
||||||
fout.write(buff, 0, k);
|
fout.write(buff, 0, k);
|
||||||
}
|
}
|
||||||
fout.close();
|
fout.close();
|
||||||
|
@ -6,6 +6,6 @@ public class YJSFilter implements ClassFilter {
|
|||||||
@Override
|
@Override
|
||||||
public boolean exposeToScripts(String arg0) {
|
public boolean exposeToScripts(String arg0) {
|
||||||
return true;
|
return true;
|
||||||
//return arg0.compareTo("java.io.File") != 0;
|
// return arg0.compareTo("java.io.File") != 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -43,19 +43,22 @@ public class AccessHandler implements AnnotationHook {
|
|||||||
public ArgPacks handle(JSEngine desktopEngine, ArgPacks argPacks) {
|
public ArgPacks handle(JSEngine desktopEngine, ArgPacks argPacks) {
|
||||||
if (requireSign) {
|
if (requireSign) {
|
||||||
if (!argPacks.request.verifySignature()) {
|
if (!argPacks.request.verifySignature()) {
|
||||||
throw new ScriptReturnException(JsonParser.parseString("{\"code\":400,\"msg\":\"permission denied\"}"));
|
throw new ScriptReturnException(
|
||||||
|
JsonParser.parseString("{\"code\":400,\"msg\":\"permission denied\"}"));
|
||||||
}
|
}
|
||||||
return argPacks;
|
return argPacks;
|
||||||
}
|
}
|
||||||
if (!argPacks.request.verifySignature()) {
|
if (!argPacks.request.verifySignature()) {
|
||||||
LOGGER.info("verify failed! clear requester," + argPacks.request.getContentStr() +
|
LOGGER.info("verify failed! clear requester," + argPacks.request.getContentStr()
|
||||||
" -> " + argPacks.request.getPublicKey() + "sign:" + argPacks.request.getSignature());
|
+ " -> " + argPacks.request.getPublicKey() + "sign:"
|
||||||
//TODO
|
+ argPacks.request.getSignature());
|
||||||
//FIXME here!
|
// TODO
|
||||||
|
// FIXME here!
|
||||||
// argPacks.request.setRequester(null);
|
// argPacks.request.setRequester(null);
|
||||||
} else
|
} else
|
||||||
LOGGER.info("verify success!" + argPacks.request.getRequester());
|
LOGGER.info("verify success!" + argPacks.request.getRequester());
|
||||||
if (acFunction == null) return argPacks;
|
if (acFunction == null)
|
||||||
|
return argPacks;
|
||||||
DesktopEngine de = (DesktopEngine) desktopEngine;
|
DesktopEngine de = (DesktopEngine) desktopEngine;
|
||||||
try {
|
try {
|
||||||
ContractRequest input = argPacks.request;
|
ContractRequest input = argPacks.request;
|
||||||
|
@ -21,14 +21,15 @@ public class ArgSchemaHandler implements AnnotationHook {
|
|||||||
public ArgSchemaHandler(AnnotationNode annoNode) {
|
public ArgSchemaHandler(AnnotationNode annoNode) {
|
||||||
a = annoNode;
|
a = annoNode;
|
||||||
String arg = a.getArgs().get(0);
|
String arg = a.getArgs().get(0);
|
||||||
// if (arg.startsWith("/")){
|
// if (arg.startsWith("/")){
|
||||||
// ;//ContractProcess.instance.engine.getResources().loadAsString(arg);
|
// ;//ContractProcess.instance.engine.getResources().loadAsString(arg);
|
||||||
// }else {
|
// }else {
|
||||||
// ;
|
// ;
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ArgSchemaHandler fromAnnotationNode(FunctionNode funNode, AnnotationNode annoNode) {
|
public static ArgSchemaHandler fromAnnotationNode(FunctionNode funNode,
|
||||||
|
AnnotationNode annoNode) {
|
||||||
return new ArgSchemaHandler(annoNode);
|
return new ArgSchemaHandler(annoNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -43,7 +44,7 @@ public class ArgSchemaHandler implements AnnotationHook {
|
|||||||
try {
|
try {
|
||||||
JsonElement obj = JsonParser.parseString(input.getArg().getAsString());
|
JsonElement obj = JsonParser.parseString(input.getArg().getAsString());
|
||||||
visitor = new ArgSchemaVisitor(obj);
|
visitor = new ArgSchemaVisitor(obj);
|
||||||
//IMPORTANT automatically convert arg type here
|
// IMPORTANT automatically convert arg type here
|
||||||
input.setArg(obj);
|
input.setArg(obj);
|
||||||
argPacks.arg = obj;
|
argPacks.arg = obj;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@ -65,7 +66,7 @@ public class ArgSchemaHandler implements AnnotationHook {
|
|||||||
JsonObject jo = new JsonObject();
|
JsonObject jo = new JsonObject();
|
||||||
jo.addProperty("msg", visitor.getException());
|
jo.addProperty("msg", visitor.getException());
|
||||||
jo.addProperty("code", visitor.errorCode);
|
jo.addProperty("code", visitor.errorCode);
|
||||||
jo.add("argSchema",JsonParser.parseString(a.getArgs().get(0)));
|
jo.add("argSchema", JsonParser.parseString(a.getArgs().get(0)));
|
||||||
throw new ScriptReturnException(jo);
|
throw new ScriptReturnException(jo);
|
||||||
}
|
}
|
||||||
return argPacks;
|
return argPacks;
|
||||||
|
@ -7,9 +7,9 @@ public class ArgSchemaVisitor extends JsonVisitor {
|
|||||||
JsonElement root;
|
JsonElement root;
|
||||||
public boolean status = true;
|
public boolean status = true;
|
||||||
public int errorCode = 0;
|
public int errorCode = 0;
|
||||||
//{"msg":"xxx","code":1000}
|
// {"msg":"xxx","code":1000}
|
||||||
//
|
//
|
||||||
// JsonElement message = new JsonPrimitive("");
|
// JsonElement message = new JsonPrimitive("");
|
||||||
public String message = "";
|
public String message = "";
|
||||||
|
|
||||||
public ArgSchemaVisitor(JsonElement ret) {
|
public ArgSchemaVisitor(JsonElement ret) {
|
||||||
@ -18,13 +18,13 @@ public class ArgSchemaVisitor extends JsonVisitor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public JsonVisitor visitObject(JsonObject schema) {
|
public JsonVisitor visitObject(JsonObject schema) {
|
||||||
//message = new JsonObject();
|
// message = new JsonObject();
|
||||||
if (root.isJsonObject()) {
|
if (root.isJsonObject()) {
|
||||||
JsonObject jo = root.getAsJsonObject();
|
JsonObject jo = root.getAsJsonObject();
|
||||||
for (String key : schema.keySet()) {
|
for (String key : schema.keySet()) {
|
||||||
if (key.startsWith("!")) {
|
if (key.startsWith("!")) {
|
||||||
//TODO
|
// TODO
|
||||||
//if(必選)
|
// if(必選)
|
||||||
if (jo.has(key.substring(1))) {
|
if (jo.has(key.substring(1))) {
|
||||||
ArgSchemaVisitor visitor = new ArgSchemaVisitor(jo.get(key.substring(1)));
|
ArgSchemaVisitor visitor = new ArgSchemaVisitor(jo.get(key.substring(1)));
|
||||||
visitor.visit(schema.get(key));
|
visitor.visit(schema.get(key));
|
||||||
@ -84,12 +84,13 @@ public class ArgSchemaVisitor extends JsonVisitor {
|
|||||||
String type = primitive.getAsString();
|
String type = primitive.getAsString();
|
||||||
try {
|
try {
|
||||||
String result = "";
|
String result = "";
|
||||||
//md5不需要参数
|
// md5不需要参数
|
||||||
if (type.equals("string")) {
|
if (type.equals("string")) {
|
||||||
if (root.isJsonPrimitive() && root.getAsJsonPrimitive().isString()) {
|
if (root.isJsonPrimitive() && root.getAsJsonPrimitive().isString()) {
|
||||||
return this;
|
return this;
|
||||||
} else {
|
} else {
|
||||||
message = "[Type error] The value (" + root.getAsJsonPrimitive().getAsString() + ") should be string";
|
message = "[Type error] The value ("
|
||||||
|
+ root.getAsJsonPrimitive().getAsString() + ") should be string";
|
||||||
status = false;
|
status = false;
|
||||||
errorCode = 1001;
|
errorCode = 1001;
|
||||||
return this;
|
return this;
|
||||||
@ -98,7 +99,8 @@ public class ArgSchemaVisitor extends JsonVisitor {
|
|||||||
if (root.isJsonPrimitive() && root.getAsJsonPrimitive().isNumber()) {
|
if (root.isJsonPrimitive() && root.getAsJsonPrimitive().isNumber()) {
|
||||||
return this;
|
return this;
|
||||||
} else {
|
} else {
|
||||||
message = "[Type error] The value (" + root.getAsJsonPrimitive().getAsString() + ") should be number";
|
message = "[Type error] The value ("
|
||||||
|
+ root.getAsJsonPrimitive().getAsString() + ") should be number";
|
||||||
status = false;
|
status = false;
|
||||||
errorCode = 1001;
|
errorCode = 1001;
|
||||||
return this;
|
return this;
|
||||||
@ -107,7 +109,8 @@ public class ArgSchemaVisitor extends JsonVisitor {
|
|||||||
if (root.isJsonPrimitive() && root.getAsJsonPrimitive().isBoolean()) {
|
if (root.isJsonPrimitive() && root.getAsJsonPrimitive().isBoolean()) {
|
||||||
return this;
|
return this;
|
||||||
} else {
|
} else {
|
||||||
message = "[Type error] The value (" + root.getAsJsonPrimitive().getAsString() + ") should be boolean";
|
message = "[Type error] The value ("
|
||||||
|
+ root.getAsJsonPrimitive().getAsString() + ") should be boolean";
|
||||||
status = false;
|
status = false;
|
||||||
errorCode = 1001;
|
errorCode = 1001;
|
||||||
return this;
|
return this;
|
||||||
@ -116,7 +119,8 @@ public class ArgSchemaVisitor extends JsonVisitor {
|
|||||||
if (root.isJsonArray()) {
|
if (root.isJsonArray()) {
|
||||||
return this;
|
return this;
|
||||||
} else {
|
} else {
|
||||||
message = "[Type error] The value (" + root.getAsJsonPrimitive().getAsString() + ") should be array";
|
message = "[Type error] The value ("
|
||||||
|
+ root.getAsJsonPrimitive().getAsString() + ") should be array";
|
||||||
status = false;
|
status = false;
|
||||||
errorCode = 1001;
|
errorCode = 1001;
|
||||||
return this;
|
return this;
|
||||||
@ -125,7 +129,8 @@ public class ArgSchemaVisitor extends JsonVisitor {
|
|||||||
if (root.isJsonObject()) {
|
if (root.isJsonObject()) {
|
||||||
return this;
|
return this;
|
||||||
} else {
|
} else {
|
||||||
message = "[Type error] The value (" + root.getAsJsonPrimitive().getAsString() + ") should be object";
|
message = "[Type error] The value ("
|
||||||
|
+ root.getAsJsonPrimitive().getAsString() + ") should be object";
|
||||||
status = false;
|
status = false;
|
||||||
errorCode = 1001;
|
errorCode = 1001;
|
||||||
return this;
|
return this;
|
||||||
|
@ -23,8 +23,8 @@ public class ConfidentialHandler implements AnnotationHook {
|
|||||||
DesktopEngine desktopEngine = (DesktopEngine) engine;
|
DesktopEngine desktopEngine = (DesktopEngine) engine;
|
||||||
ConfidentialContractUtil.copyTemplateToDestination(input);
|
ConfidentialContractUtil.copyTemplateToDestination(input);
|
||||||
ScriptObjectMirror globalVars = (ScriptObjectMirror) desktopEngine.get("Global");
|
ScriptObjectMirror globalVars = (ScriptObjectMirror) desktopEngine.get("Global");
|
||||||
ConfidentialContractUtil.dumpScriptAndStates(
|
ConfidentialContractUtil.dumpScriptAndStates(desktopEngine.engine, fun, input,
|
||||||
desktopEngine.engine, fun, input, globalVars);
|
globalVars);
|
||||||
// run in SGX instead of Nashorn if function has @Confidential annotation
|
// run in SGX instead of Nashorn if function has @Confidential annotation
|
||||||
argPacks.ret = ConfidentialContractUtil.executeConfidentialContract(input);
|
argPacks.ret = ConfidentialContractUtil.executeConfidentialContract(input);
|
||||||
return argPacks;
|
return argPacks;
|
||||||
|
@ -35,23 +35,27 @@ public class DOOPAfterExecHandler implements AnnotationHook {
|
|||||||
// if http, directly return
|
// if http, directly return
|
||||||
if (doipMessagePacker.source.equals("http")) {
|
if (doipMessagePacker.source.equals("http")) {
|
||||||
if (argPacks.ret != null && argPacks.ret instanceof DoipMessage) {
|
if (argPacks.ret != null && argPacks.ret instanceof DoipMessage) {
|
||||||
argPacks.ret = JsonUtil.parseObject(JsonDoipMessage.fromDoipMessage((DoipMessage) argPacks.ret));
|
argPacks.ret = JsonUtil.parseObject(
|
||||||
|
JsonDoipMessage.fromDoipMessage((DoipMessage) argPacks.ret));
|
||||||
}
|
}
|
||||||
return argPacks;
|
return argPacks;
|
||||||
} else {
|
} else {
|
||||||
// pack
|
// pack
|
||||||
if (!(argPacks.ret instanceof DoipMessage)) {
|
if (!(argPacks.ret instanceof DoipMessage)) {
|
||||||
JsonObject jsonObjectRes = ((JsonElement) argPacks.ret).getAsJsonObject();
|
JsonObject jsonObjectRes = ((JsonElement) argPacks.ret).getAsJsonObject();
|
||||||
if (!jsonObjectRes.has("bodyBase64Encoded") || jsonObjectRes.get("bodyBase64Encoded").getAsBoolean() == false) {
|
if (!jsonObjectRes.has("bodyBase64Encoded")
|
||||||
|
|| jsonObjectRes.get("bodyBase64Encoded").getAsBoolean() == false) {
|
||||||
if (jsonObjectRes.has("body")) {
|
if (jsonObjectRes.has("body")) {
|
||||||
String body = jsonObjectRes.get("body").getAsString();
|
String body = jsonObjectRes.get("body").getAsString();
|
||||||
jsonObjectRes.addProperty("body", ByteUtil.encodeBASE64(body.getBytes(StandardCharsets.UTF_8)));
|
jsonObjectRes.addProperty("body",
|
||||||
|
ByteUtil.encodeBASE64(body.getBytes(StandardCharsets.UTF_8)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// validate json response
|
// validate json response
|
||||||
ArgSchemaVisitor visitor = new ArgSchemaVisitor(jsonObjectRes);
|
ArgSchemaVisitor visitor = new ArgSchemaVisitor(jsonObjectRes);
|
||||||
validateJsonElementRulesByArgSchemaVisitor(jsonResponseRules, visitor);
|
validateJsonElementRulesByArgSchemaVisitor(jsonResponseRules, visitor);
|
||||||
JsonDoipMessage returnedMessage = JsonUtil.fromJson(jsonObjectRes, JsonDoipMessage.class);
|
JsonDoipMessage returnedMessage =
|
||||||
|
JsonUtil.fromJson(jsonObjectRes, JsonDoipMessage.class);
|
||||||
argPacks.ret = returnedMessage.toResponseDoipMessage(originDoipMsg);
|
argPacks.ret = returnedMessage.toResponseDoipMessage(originDoipMsg);
|
||||||
}
|
}
|
||||||
return argPacks;
|
return argPacks;
|
||||||
@ -71,7 +75,8 @@ public class DOOPAfterExecHandler implements AnnotationHook {
|
|||||||
case Search:
|
case Search:
|
||||||
case ListOps:
|
case ListOps:
|
||||||
case Delete:
|
case Delete:
|
||||||
return JsonParser.parseString("{\"header\":{\"response\":\"string\",\"attributes\":{}},\"body\":\"string\"}");
|
return JsonParser.parseString(
|
||||||
|
"{\"header\":{\"response\":\"string\",\"attributes\":{}},\"body\":\"string\"}");
|
||||||
case Extension:
|
case Extension:
|
||||||
case Unknown:
|
case Unknown:
|
||||||
default:
|
default:
|
||||||
@ -80,17 +85,21 @@ public class DOOPAfterExecHandler implements AnnotationHook {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// old convert jsonResponse from argPack's ret to Doip response in doip chain logic
|
// old convert jsonResponse from argPack's ret to Doip response in doip chain logic
|
||||||
public DoipMessage convertJsonResponseToDoipMessage(FunctionNode fn, JsonElement jsonResponse, DoipMessage msg) {
|
public DoipMessage convertJsonResponseToDoipMessage(FunctionNode fn, JsonElement jsonResponse,
|
||||||
|
DoipMessage msg) {
|
||||||
JsonObject jsonParams = jsonResponse.getAsJsonObject();
|
JsonObject jsonParams = jsonResponse.getAsJsonObject();
|
||||||
// validate json response
|
// validate json response
|
||||||
ArgSchemaVisitor visitor = new ArgSchemaVisitor(jsonResponse);
|
ArgSchemaVisitor visitor = new ArgSchemaVisitor(jsonResponse);
|
||||||
validateJsonElementRulesByArgSchemaVisitor(jsonResponseRules, visitor);
|
validateJsonElementRulesByArgSchemaVisitor(jsonResponseRules, visitor);
|
||||||
|
|
||||||
JsonObject header = jsonParams.get("header") != null ? jsonParams.get("header").getAsJsonObject() : null;
|
JsonObject header =
|
||||||
|
jsonParams.get("header") != null ? jsonParams.get("header").getAsJsonObject()
|
||||||
|
: null;
|
||||||
String body = jsonParams.get("body") != null ? jsonParams.get("body").getAsString() : null;
|
String body = jsonParams.get("body") != null ? jsonParams.get("body").getAsString() : null;
|
||||||
|
|
||||||
if (header != null) {
|
if (header != null) {
|
||||||
String headerRespCode = header.get("response") != null ? header.get("response").getAsString() : null;
|
String headerRespCode =
|
||||||
|
header.get("response") != null ? header.get("response").getAsString() : null;
|
||||||
if (headerRespCode != null) {
|
if (headerRespCode != null) {
|
||||||
for (DoipResponseCode responseCode : DoipResponseCode.values()) {
|
for (DoipResponseCode responseCode : DoipResponseCode.values()) {
|
||||||
if (responseCode.toString().equals(headerRespCode)) {
|
if (responseCode.toString().equals(headerRespCode)) {
|
||||||
@ -107,7 +116,8 @@ public class DOOPAfterExecHandler implements AnnotationHook {
|
|||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void validateJsonElementRulesByArgSchemaVisitor(JsonElement jsonElement, ArgSchemaVisitor visitor) {
|
public static void validateJsonElementRulesByArgSchemaVisitor(JsonElement jsonElement,
|
||||||
|
ArgSchemaVisitor visitor) {
|
||||||
visitor.visit(jsonElement);
|
visitor.visit(jsonElement);
|
||||||
if (!visitor.getStatus()) {
|
if (!visitor.getStatus()) {
|
||||||
JsonObject jo = new JsonObject();
|
JsonObject jo = new JsonObject();
|
||||||
|
@ -40,7 +40,8 @@ public class DOOPBeforeExecHandler implements AnnotationHook {
|
|||||||
doipMsgPackerArg.rawDoipMsg = convertHttpRequestToDoipMessage(httpReq);
|
doipMsgPackerArg.rawDoipMsg = convertHttpRequestToDoipMessage(httpReq);
|
||||||
|
|
||||||
if (httpReq.verifySignature()) {
|
if (httpReq.verifySignature()) {
|
||||||
doipMsgPackerArg.rawDoipMsg.credential = new MessageCredential(httpReq.getRequester(), new byte[0]);
|
doipMsgPackerArg.rawDoipMsg.credential =
|
||||||
|
new MessageCredential(httpReq.getRequester(), new byte[0]);
|
||||||
} else {
|
} else {
|
||||||
doipMsgPackerArg.rawDoipMsg.credential = null;
|
doipMsgPackerArg.rawDoipMsg.credential = null;
|
||||||
}
|
}
|
||||||
@ -70,11 +71,14 @@ public class DOOPBeforeExecHandler implements AnnotationHook {
|
|||||||
return JsonParser.parseString("{\"!header\":{\"!identifier\":\"string\"}}");
|
return JsonParser.parseString("{\"!header\":{\"!identifier\":\"string\"}}");
|
||||||
case Create:
|
case Create:
|
||||||
case Update:
|
case Update:
|
||||||
return JsonParser.parseString("{\"!header\":{\"!identifier\":\"string\"}, \"!body\":\"string\"}");
|
return JsonParser.parseString(
|
||||||
|
"{\"!header\":{\"!identifier\":\"string\"}, \"!body\":\"string\"}");
|
||||||
case Search:
|
case Search:
|
||||||
return JsonParser.parseString("{\"!header\":{\"!identifier\":\"string\", \"!attributes\":{\"!query\":\"string\", \"!pageNum\":\"int\", \"!pageSize\":\"int\", \"!type\":\"string\"}}}");
|
return JsonParser.parseString(
|
||||||
|
"{\"!header\":{\"!identifier\":\"string\", \"!attributes\":{\"!query\":\"string\", \"!pageNum\":\"int\", \"!pageSize\":\"int\", \"!type\":\"string\"}}}");
|
||||||
case Retrieve:
|
case Retrieve:
|
||||||
return JsonParser.parseString("{\"!header\":{\"!identifier\":\"string\", \"attributes\":{\"element\":\"string\", \"includeElementData\":\"boolean\"}}}");
|
return JsonParser.parseString(
|
||||||
|
"{\"!header\":{\"!identifier\":\"string\", \"attributes\":{\"element\":\"string\", \"includeElementData\":\"boolean\"}}}");
|
||||||
case Extension:
|
case Extension:
|
||||||
case Unknown:
|
case Unknown:
|
||||||
default:
|
default:
|
||||||
@ -92,7 +96,8 @@ public class DOOPBeforeExecHandler implements AnnotationHook {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static void validateJsonElementRulesByArgSchemaVisitor(JsonElement jsonElement, ArgSchemaVisitor visitor) {
|
public static void validateJsonElementRulesByArgSchemaVisitor(JsonElement jsonElement,
|
||||||
|
ArgSchemaVisitor visitor) {
|
||||||
visitor.visit(jsonElement);
|
visitor.visit(jsonElement);
|
||||||
if (!visitor.getStatus()) {
|
if (!visitor.getStatus()) {
|
||||||
JsonObject jo = new JsonObject();
|
JsonObject jo = new JsonObject();
|
||||||
|
@ -27,25 +27,25 @@ public class HomomorphicDecryptHandler implements AnnotationHook {
|
|||||||
@Override
|
@Override
|
||||||
public ArgPacks handle(JSEngine engine, ArgPacks argPacks) {
|
public ArgPacks handle(JSEngine engine, ArgPacks argPacks) {
|
||||||
try {
|
try {
|
||||||
// GetHomArgs args =
|
// GetHomArgs args =
|
||||||
// new GetHomArgs(
|
// new GetHomArgs(
|
||||||
// input.getRequester(), this.fun.getSecretID().replaceAll("\"", ""));
|
// input.getRequester(), this.fun.getSecretID().replaceAll("\"", ""));
|
||||||
// String arg = JsonUtil.toJson(args);
|
// String arg = JsonUtil.toJson(args);
|
||||||
JsonElement homoDecryptConf = this.fun.getHomoDecryptConf();
|
JsonElement homoDecryptConf = this.fun.getHomoDecryptConf();
|
||||||
if (null != homoDecryptConf && !homoDecryptConf.isJsonNull()) {
|
if (null != homoDecryptConf && !homoDecryptConf.isJsonNull()) {
|
||||||
String res = (String)
|
String res = (String) JavaScriptEntry.executeContract("keyManager_1", "getPrivKey",
|
||||||
JavaScriptEntry.executeContract(
|
|
||||||
"keyManager_1",
|
|
||||||
"getPrivKey",
|
|
||||||
this.fun.getSecretID().replaceAll("\"", ""));
|
this.fun.getSecretID().replaceAll("\"", ""));
|
||||||
LOGGER.info("HomomorphicDecryptHandler--------------------------------1: " + res);
|
LOGGER.info("HomomorphicDecryptHandler--------------------------------1: " + res);
|
||||||
ContractResult results = JsonUtil.fromJson(res, ContractResult.class);
|
ContractResult results = JsonUtil.fromJson(res, ContractResult.class);
|
||||||
String privKeyStr = results.result.getAsString();
|
String privKeyStr = results.result.getAsString();
|
||||||
LOGGER.info("HomomorphicEncryptHandler--------------------------------2: " + privKeyStr);
|
LOGGER.info("HomomorphicEncryptHandler--------------------------------2: "
|
||||||
|
+ privKeyStr);
|
||||||
RSAPrivateKey privkey = (RSAPrivateKey) PaillierKeyPair.pemToPrivateKey(privKeyStr);
|
RSAPrivateKey privkey = (RSAPrivateKey) PaillierKeyPair.pemToPrivateKey(privKeyStr);
|
||||||
LOGGER.info("HomomorphicEncryptHandler--------------------------------3: " + privkey);
|
LOGGER.info(
|
||||||
|
"HomomorphicEncryptHandler--------------------------------3: " + privkey);
|
||||||
HomoVisitor.privateKey = privkey;
|
HomoVisitor.privateKey = privkey;
|
||||||
argPacks.ret = getDecryptResult(homoDecryptConf, JsonUtil.parseObject(argPacks.ret));
|
argPacks.ret =
|
||||||
|
getDecryptResult(homoDecryptConf, JsonUtil.parseObject(argPacks.ret));
|
||||||
if (null != argPacks.ret) {
|
if (null != argPacks.ret) {
|
||||||
return argPacks;
|
return argPacks;
|
||||||
}
|
}
|
||||||
|
@ -29,36 +29,36 @@ public class HomomorphicEncryptHandler implements AnnotationHook {
|
|||||||
public ArgPacks handle(JSEngine engine, ArgPacks argPacks) {
|
public ArgPacks handle(JSEngine engine, ArgPacks argPacks) {
|
||||||
try {
|
try {
|
||||||
ContractRequest input = argPacks.request;
|
ContractRequest input = argPacks.request;
|
||||||
LOGGER.info(
|
LOGGER.info("HomomorphicEncryptHandler--------------------------------1: "
|
||||||
"HomomorphicEncryptHandler--------------------------------1: "
|
|
||||||
+ input.getRequester());
|
+ input.getRequester());
|
||||||
LOGGER.info(
|
LOGGER.info("HomomorphicEncryptHandler--------------------------------2: "
|
||||||
"HomomorphicEncryptHandler--------------------------------2: "
|
|
||||||
+ this.fun.getSecretID());
|
+ this.fun.getSecretID());
|
||||||
JsonElement response = (JsonElement) argPacks.ret;
|
JsonElement response = (JsonElement) argPacks.ret;
|
||||||
JsonElement homoEncryptConf = this.fun.getHomoEncryptConf();
|
JsonElement homoEncryptConf = this.fun.getHomoEncryptConf();
|
||||||
if (homoEncryptConf != null && !homoEncryptConf.isJsonNull()) {
|
if (homoEncryptConf != null && !homoEncryptConf.isJsonNull()) {
|
||||||
String res =
|
String res = (String) JavaScriptEntry.executeContract("keyManager_1", "getPubKey",
|
||||||
(String) JavaScriptEntry.executeContract(
|
|
||||||
"keyManager_1",
|
|
||||||
"getPubKey",
|
|
||||||
this.fun.getSecretID().replaceAll("\"", ""));
|
this.fun.getSecretID().replaceAll("\"", ""));
|
||||||
// String res =
|
// String res =
|
||||||
// JavaScriptEntry.executeContract(
|
// JavaScriptEntry.executeContract(
|
||||||
// this.fun.getKeyManagerID(),
|
// this.fun.getKeyManagerID(),
|
||||||
// "getPubKey",
|
// "getPubKey",
|
||||||
// this.fun.getSecretID().replaceAll("\"", ""));
|
// this.fun.getSecretID().replaceAll("\"", ""));
|
||||||
LOGGER.info("HomomorphicEncryptHandler--------------------------------4: " + res);
|
LOGGER.info("HomomorphicEncryptHandler--------------------------------4: " + res);
|
||||||
ContractResult results = JsonUtil.fromJson(res, ContractResult.class);
|
ContractResult results = JsonUtil.fromJson(res, ContractResult.class);
|
||||||
String pubKeyStr = results.result.getAsString();
|
String pubKeyStr = results.result.getAsString();
|
||||||
LOGGER.info("HomomorphicEncryptHandler--------------------------------5: " + pubKeyStr);
|
LOGGER.info(
|
||||||
|
"HomomorphicEncryptHandler--------------------------------5: " + pubKeyStr);
|
||||||
HomoVisitor.publicKey = (RSAPublicKey) PaillierKeyPair.pemToPublicKey(pubKeyStr);
|
HomoVisitor.publicKey = (RSAPublicKey) PaillierKeyPair.pemToPublicKey(pubKeyStr);
|
||||||
// if (homoEncryptConf.getAsJsonPrimitive().isString())
|
// if (homoEncryptConf.getAsJsonPrimitive().isString())
|
||||||
// homoEncryptConf = JsonParser.parseString(homoEncryptConf.getAsString());
|
// homoEncryptConf = JsonParser.parseString(homoEncryptConf.getAsString());
|
||||||
LOGGER.info("HomomorphicEncryptHandler--------------------------------6: " + homoEncryptConf);
|
LOGGER.info("HomomorphicEncryptHandler--------------------------------6: "
|
||||||
LOGGER.info("HomomorphicEncryptHandler--------------------------------7: " + argPacks.ret);
|
+ homoEncryptConf);
|
||||||
LOGGER.info("HomomorphicEncryptHandler--------------------------------8: " + argPacks.ret.toString());
|
LOGGER.info("HomomorphicEncryptHandler--------------------------------7: "
|
||||||
// LOGGER.info("HomomorphicEncryptHandler--------------------------------9: " + JsonUtil.toJson(ret));
|
+ argPacks.ret);
|
||||||
|
LOGGER.info("HomomorphicEncryptHandler--------------------------------8: "
|
||||||
|
+ argPacks.ret.toString());
|
||||||
|
// LOGGER.info("HomomorphicEncryptHandler--------------------------------9: " +
|
||||||
|
// JsonUtil.toJson(ret));
|
||||||
argPacks.ret = getEncryptResult(homoEncryptConf, response);
|
argPacks.ret = getEncryptResult(homoEncryptConf, response);
|
||||||
if (argPacks.ret != null) {
|
if (argPacks.ret != null) {
|
||||||
return argPacks;
|
return argPacks;
|
||||||
@ -73,9 +73,9 @@ public class HomomorphicEncryptHandler implements AnnotationHook {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Object getEncryptResult(JsonElement homoEncryptConf, JsonElement data) {
|
private Object getEncryptResult(JsonElement homoEncryptConf, JsonElement data) {
|
||||||
// if (null == homoEncryptConf || homoEncryptConf.getAsString().isEmpty()) {
|
// if (null == homoEncryptConf || homoEncryptConf.getAsString().isEmpty()) {
|
||||||
// return data;
|
// return data;
|
||||||
// }
|
// }
|
||||||
if (null == homoEncryptConf) {
|
if (null == homoEncryptConf) {
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
@ -25,14 +25,14 @@ public class MaskHandler implements AnnotationHook {
|
|||||||
if (null != maskConf) {
|
if (null != maskConf) {
|
||||||
LOGGER.debug("execute maskConf: " + maskConf);
|
LOGGER.debug("execute maskConf: " + maskConf);
|
||||||
String s1 = ret.toString();
|
String s1 = ret.toString();
|
||||||
//budeijin
|
// budeijin
|
||||||
//"{\"count\":1}"
|
// "{\"count\":1}"
|
||||||
//{"count":1}
|
// {"count":1}
|
||||||
//System.out.println(s1);
|
// System.out.println(s1);
|
||||||
s1 = s1.replace("\\", "");
|
s1 = s1.replace("\\", "");
|
||||||
s1 = s1.substring(1, s1.length() - 1);
|
s1 = s1.substring(1, s1.length() - 1);
|
||||||
//System.out.println(s1);
|
// System.out.println(s1);
|
||||||
//System.out.println(JsonParser.parseString(s1));
|
// System.out.println(JsonParser.parseString(s1));
|
||||||
MaskVisitor visitor = new MaskVisitor(JsonParser.parseString(s1));
|
MaskVisitor visitor = new MaskVisitor(JsonParser.parseString(s1));
|
||||||
visitor.visit(maskConf);
|
visitor.visit(maskConf);
|
||||||
ret = visitor.get();
|
ret = visitor.get();
|
||||||
|
@ -23,7 +23,7 @@ public class MaskVisitor extends JsonVisitor {
|
|||||||
JsonObject jo = root.getAsJsonObject();
|
JsonObject jo = root.getAsJsonObject();
|
||||||
for (String key : mask.keySet()) {
|
for (String key : mask.keySet()) {
|
||||||
if (jo.has(key)) {
|
if (jo.has(key)) {
|
||||||
//TODO
|
// TODO
|
||||||
MaskVisitor visitor = new MaskVisitor(jo.get(key));
|
MaskVisitor visitor = new MaskVisitor(jo.get(key));
|
||||||
visitor.visit(mask.get(key));
|
visitor.visit(mask.get(key));
|
||||||
jo.add(key, visitor.get());
|
jo.add(key, visitor.get());
|
||||||
@ -58,7 +58,7 @@ public class MaskVisitor extends JsonVisitor {
|
|||||||
String method = primitive.getAsString();
|
String method = primitive.getAsString();
|
||||||
try {
|
try {
|
||||||
String result = "";
|
String result = "";
|
||||||
//md5不需要参数
|
// md5不需要参数
|
||||||
if (method.equals("md5")) {
|
if (method.equals("md5")) {
|
||||||
MD5EncryptionImpl masker = new MD5EncryptionImpl();
|
MD5EncryptionImpl masker = new MD5EncryptionImpl();
|
||||||
result = masker.execute(root.getAsString());
|
result = masker.execute(root.getAsString());
|
||||||
@ -69,7 +69,7 @@ public class MaskVisitor extends JsonVisitor {
|
|||||||
FormatPreservingEncryptionImpl masker = new FormatPreservingEncryptionImpl();
|
FormatPreservingEncryptionImpl masker = new FormatPreservingEncryptionImpl();
|
||||||
result = masker.execute(root.getAsString());
|
result = masker.execute(root.getAsString());
|
||||||
}
|
}
|
||||||
//edp需要精度的参数
|
// edp需要精度的参数
|
||||||
else if (method.equals("edp")) {
|
else if (method.equals("edp")) {
|
||||||
EpsilonDifferentialPrivacyImpl masker = new EpsilonDifferentialPrivacyImpl();
|
EpsilonDifferentialPrivacyImpl masker = new EpsilonDifferentialPrivacyImpl();
|
||||||
double epsilon = 1;
|
double epsilon = 1;
|
||||||
@ -87,11 +87,11 @@ public class MaskVisitor extends JsonVisitor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//String result = masker.execute(primitive.toString());
|
// String result = masker.execute(primitive.toString());
|
||||||
//System.out.println(result);
|
// System.out.println(result);
|
||||||
|
|
||||||
//root = new JsonPrimitive(root.getAsString().substring(0, 2));
|
// root = new JsonPrimitive(root.getAsString().substring(0, 2));
|
||||||
//https://github.com/guohf/DataX-Masking
|
// https://github.com/guohf/DataX-Masking
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,8 @@ public class MockTemplateHandler implements AnnotationHook {
|
|||||||
MockUtil Mock = new MockUtil();
|
MockUtil Mock = new MockUtil();
|
||||||
argPacks.ret = Mock.mock(template).toString();
|
argPacks.ret = Mock.mock(template).toString();
|
||||||
return argPacks;
|
return argPacks;
|
||||||
} else return argPacks; //When mock config is null defined just ignore.
|
} else
|
||||||
|
return argPacks; // When mock config is null defined just ignore.
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
@ -13,10 +13,9 @@ import org.commonmark.parser.Parser;
|
|||||||
|
|
||||||
public class ReadMeHandler implements AnnotationHook {
|
public class ReadMeHandler implements AnnotationHook {
|
||||||
String getReadMeData(DesktopEngine desktopEngine, ContractRequest c) {
|
String getReadMeData(DesktopEngine desktopEngine, ContractRequest c) {
|
||||||
String fileReadme =
|
String fileReadme = desktopEngine.getResources().loadAsString("/assets/README.md"); // is
|
||||||
desktopEngine
|
// "/README.md"
|
||||||
.getResources()
|
// not"./README.md"!!!!
|
||||||
.loadAsString("/assets/README.md"); // is "/README.md" not"./README.md"!!!!
|
|
||||||
// System.out.println("fileReadme:" + fileReadme);
|
// System.out.println("fileReadme:" + fileReadme);
|
||||||
if (null == fileReadme) {
|
if (null == fileReadme) {
|
||||||
return "项目目录下无预览文档";
|
return "项目目录下无预览文档";
|
||||||
@ -30,18 +29,11 @@ public class ReadMeHandler implements AnnotationHook {
|
|||||||
while (visitor != null) {
|
while (visitor != null) {
|
||||||
if (visitor instanceof Heading) {
|
if (visitor instanceof Heading) {
|
||||||
if (((Heading) visitor).getLevel() == 2) {
|
if (((Heading) visitor).getLevel() == 2) {
|
||||||
if (((Text) (visitor.getFirstChild()))
|
if (((Text) (visitor.getFirstChild())).getLiteral()
|
||||||
.getLiteral()
|
|
||||||
.equals(targetFunction)) {
|
.equals(targetFunction)) {
|
||||||
FencedCodeBlock blockResult =
|
FencedCodeBlock blockResult =
|
||||||
(FencedCodeBlock)
|
(FencedCodeBlock) (visitor.getNext().getNext().getNext()
|
||||||
(visitor.getNext()
|
.getNext().getNext().getNext().getNext());
|
||||||
.getNext()
|
|
||||||
.getNext()
|
|
||||||
.getNext()
|
|
||||||
.getNext()
|
|
||||||
.getNext()
|
|
||||||
.getNext());
|
|
||||||
result = blockResult.getLiteral();
|
result = blockResult.getLiteral();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -48,7 +48,7 @@ public class ResultSchemaHandler implements AnnotationHook {
|
|||||||
try {
|
try {
|
||||||
JsonElement obj = JsonParser.parseString(je.getAsString());
|
JsonElement obj = JsonParser.parseString(je.getAsString());
|
||||||
visitor = new ArgSchemaVisitor(obj);
|
visitor = new ArgSchemaVisitor(obj);
|
||||||
//IMPORTANT automatically convert arg type here
|
// IMPORTANT automatically convert arg type here
|
||||||
argPacks.ret = obj;
|
argPacks.ret = obj;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@ -78,7 +78,8 @@ public class ResultSchemaHandler implements AnnotationHook {
|
|||||||
return argPacks;
|
return argPacks;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ResultSchemaHandler fromAnnotationNode(FunctionNode funNode, AnnotationNode annoNode) {
|
public static ResultSchemaHandler fromAnnotationNode(FunctionNode funNode,
|
||||||
|
AnnotationNode annoNode) {
|
||||||
return new ResultSchemaHandler(annoNode);
|
return new ResultSchemaHandler(annoNode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,8 +3,7 @@ package org.bdware.sc.engine.setArgs;
|
|||||||
public class GetHomArgs {
|
public class GetHomArgs {
|
||||||
public String secretID;
|
public String secretID;
|
||||||
|
|
||||||
public GetHomArgs() {
|
public GetHomArgs() {}
|
||||||
}
|
|
||||||
|
|
||||||
public GetHomArgs(String secretID) {
|
public GetHomArgs(String secretID) {
|
||||||
this.secretID = secretID;
|
this.secretID = secretID;
|
||||||
|
@ -11,8 +11,7 @@ public class DoipMessagePacker {
|
|||||||
// the well-composed DoipMessage
|
// the well-composed DoipMessage
|
||||||
public DoipMessage rawDoipMsg;
|
public DoipMessage rawDoipMsg;
|
||||||
|
|
||||||
public DoipMessagePacker() {
|
public DoipMessagePacker() {}
|
||||||
}
|
|
||||||
|
|
||||||
public DoipMessagePacker(String source, DoipMessage rawMsg) {
|
public DoipMessagePacker(String source, DoipMessage rawMsg) {
|
||||||
this.source = source;
|
this.source = source;
|
||||||
@ -28,6 +27,7 @@ public class DoipMessagePacker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Object toJSObject() {
|
public Object toJSObject() {
|
||||||
return JSONTool.convertJsonElementToMirror(JsonUtil.parseObject(JsonDoipMessage.fromDoipMessage(rawDoipMsg)));
|
return JSONTool.convertJsonElementToMirror(
|
||||||
|
JsonUtil.parseObject(JsonDoipMessage.fromDoipMessage(rawDoipMsg)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -104,8 +104,8 @@ public class ContractHandler extends MsgHandler implements Runnable {
|
|||||||
|
|
||||||
@Description("set members")
|
@Description("set members")
|
||||||
public void setMembers(GetMessage msg, ResultCallback cb) {
|
public void setMembers(GetMessage msg, ResultCallback cb) {
|
||||||
cb.onResult(cs.setMembers(JsonUtil.fromJson(msg.arg, new TypeToken<List<String>>() {
|
cb.onResult(cs.setMembers(
|
||||||
}.getType())));
|
JsonUtil.fromJson(msg.arg, new TypeToken<List<String>>() {}.getType())));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Description("get current contract name")
|
@Description("get current contract name")
|
||||||
|
@ -42,14 +42,16 @@ public class DOOPRequestHandler implements DoipRequestHandler {
|
|||||||
@Override
|
@Override
|
||||||
public DoipMessage onRequest(ChannelHandlerContext ctx, DoipMessage msg) {
|
public DoipMessage onRequest(ChannelHandlerContext ctx, DoipMessage msg) {
|
||||||
String str = msg.header.parameters.operation;
|
String str = msg.header.parameters.operation;
|
||||||
if (msg.header != null && msg.header.parameters.operation.equals(SharableVarManager.SHARABLEOP)) {
|
if (msg.header != null
|
||||||
|
&& msg.header.parameters.operation.equals(SharableVarManager.SHARABLEOP)) {
|
||||||
return SharableVarManager.instance.handleSyncMessage(msg);
|
return SharableVarManager.instance.handleSyncMessage(msg);
|
||||||
}
|
}
|
||||||
logger.debug("[Call operation] name: " + str);
|
logger.debug("[Call operation] name: " + str);
|
||||||
if (str != null) {
|
if (str != null) {
|
||||||
FunctionNode fn;
|
FunctionNode fn;
|
||||||
fn = doipFunctionNodeMap.get(str);
|
fn = doipFunctionNodeMap.get(str);
|
||||||
if (fn == null) fn = doipFunctionNodeMap.get(BasicOperations.Unknown.getName());
|
if (fn == null)
|
||||||
|
fn = doipFunctionNodeMap.get(BasicOperations.Unknown.getName());
|
||||||
if (fn != null) {
|
if (fn != null) {
|
||||||
return buildRequestAndInvokeEngine(fn, msg);
|
return buildRequestAndInvokeEngine(fn, msg);
|
||||||
}
|
}
|
||||||
@ -62,7 +64,8 @@ public class DOOPRequestHandler implements DoipRequestHandler {
|
|||||||
DoipMessagePacker arg = new DoipMessagePacker("doip", msg);
|
DoipMessagePacker arg = new DoipMessagePacker("doip", msg);
|
||||||
try {
|
try {
|
||||||
// 改变调用的函数 + 构造DoipMessagePacker
|
// 改变调用的函数 + 构造DoipMessagePacker
|
||||||
Object ret = ContractProcess.instance.engine.executeWithoutLock(fn, contractRequest, arg);
|
Object ret =
|
||||||
|
ContractProcess.instance.engine.executeWithoutLock(fn, contractRequest, arg);
|
||||||
DoipMessage finalDoipMsg = (DoipMessage) ret;
|
DoipMessage finalDoipMsg = (DoipMessage) ret;
|
||||||
finalDoipMsg.requestID = msg.requestID;
|
finalDoipMsg.requestID = msg.requestID;
|
||||||
if (finalDoipMsg.header.parameters == null) {
|
if (finalDoipMsg.header.parameters == null) {
|
||||||
@ -71,16 +74,19 @@ public class DOOPRequestHandler implements DoipRequestHandler {
|
|||||||
if (finalDoipMsg.header.parameters.attributes == null) {
|
if (finalDoipMsg.header.parameters.attributes == null) {
|
||||||
finalDoipMsg.header.parameters.attributes = new JsonObject();
|
finalDoipMsg.header.parameters.attributes = new JsonObject();
|
||||||
}
|
}
|
||||||
finalDoipMsg.header.parameters.attributes.addProperty("nodeID", String.valueOf(JavaScriptEntry.shardingID));
|
finalDoipMsg.header.parameters.attributes.addProperty("nodeID",
|
||||||
|
String.valueOf(JavaScriptEntry.shardingID));
|
||||||
return finalDoipMsg;
|
return finalDoipMsg;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
ByteArrayOutputStream bo = new ByteArrayOutputStream();
|
ByteArrayOutputStream bo = new ByteArrayOutputStream();
|
||||||
e.printStackTrace(new PrintStream(bo));
|
e.printStackTrace(new PrintStream(bo));
|
||||||
DoipMessageFactory.DoipMessageBuilder builder = new DoipMessageFactory.DoipMessageBuilder();
|
DoipMessageFactory.DoipMessageBuilder builder =
|
||||||
|
new DoipMessageFactory.DoipMessageBuilder();
|
||||||
builder.createResponse(DoipResponseCode.Declined, msg);
|
builder.createResponse(DoipResponseCode.Declined, msg);
|
||||||
builder.setBody(bo.toByteArray());
|
builder.setBody(bo.toByteArray());
|
||||||
builder.addAttributes("nodeID", String.valueOf(JavaScriptEntry.shardingID));
|
builder.addAttributes("nodeID", String.valueOf(JavaScriptEntry.shardingID));
|
||||||
logger.error("buildRequestAndInvokeEngine has something wrong, executeWithoutLock err or validateJsonElementRulesByArgSchemaVisitor err");
|
logger.error(
|
||||||
|
"buildRequestAndInvokeEngine has something wrong, executeWithoutLock err or validateJsonElementRulesByArgSchemaVisitor err");
|
||||||
return builder.create();
|
return builder.create();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,13 +7,13 @@ public class JSEDump implements Serializable {
|
|||||||
long ranSeed;
|
long ranSeed;
|
||||||
int numsOfCopies;
|
int numsOfCopies;
|
||||||
|
|
||||||
public JSEDump(long id,long ra,int nums){
|
public JSEDump(long id, long ra, int nums) {
|
||||||
invokeID = id;
|
invokeID = id;
|
||||||
ranSeed = ra;
|
ranSeed = ra;
|
||||||
numsOfCopies = nums;
|
numsOfCopies = nums;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void printContent(){
|
public void printContent() {
|
||||||
System.out.println("invokeID=" + invokeID);
|
System.out.println("invokeID=" + invokeID);
|
||||||
System.out.println("ranSeed=" + ranSeed);
|
System.out.println("ranSeed=" + ranSeed);
|
||||||
System.out.println("numsOfCopies=" + numsOfCopies);
|
System.out.println("numsOfCopies=" + numsOfCopies);
|
||||||
|
@ -4,8 +4,9 @@ import jdk.internal.dynalink.beans.StaticClass;
|
|||||||
import wrp.jdk.nashorn.api.scripting.ScriptObjectMirror;
|
import wrp.jdk.nashorn.api.scripting.ScriptObjectMirror;
|
||||||
|
|
||||||
public enum MOType {
|
public enum MOType {
|
||||||
String(true), Int(true), Double(true), Boolean(true),JSObject(false), JSArray(false), JavaObject(false), Method(false),
|
String(true), Int(true), Double(true), Boolean(true), JSObject(false), JSArray(
|
||||||
Undefined(true), JSFunction(false),JSStatic(false);
|
false), JavaObject(
|
||||||
|
false), Method(false), Undefined(true), JSFunction(false), JSStatic(false);
|
||||||
|
|
||||||
private boolean isPrimitive;
|
private boolean isPrimitive;
|
||||||
|
|
||||||
@ -25,9 +26,9 @@ public enum MOType {
|
|||||||
} else if (obj instanceof ScriptObjectMirror) {
|
} else if (obj instanceof ScriptObjectMirror) {
|
||||||
// ------
|
// ------
|
||||||
return JSObject;
|
return JSObject;
|
||||||
}else if(obj instanceof StaticClass) {
|
} else if (obj instanceof StaticClass) {
|
||||||
return JSStatic;
|
return JSStatic;
|
||||||
}else if(obj instanceof Boolean){
|
} else if (obj instanceof Boolean) {
|
||||||
return Boolean;
|
return Boolean;
|
||||||
}
|
}
|
||||||
return JSObject;
|
return JSObject;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package org.bdware.sc.memory;
|
package org.bdware.sc.memory;
|
||||||
|
|
||||||
public class MemoryArrayObject extends MemoryJSObject{
|
public class MemoryArrayObject extends MemoryJSObject {
|
||||||
|
|
||||||
private static final long serialVersionUID = -5805776423219733634L;
|
private static final long serialVersionUID = -5805776423219733634L;
|
||||||
|
|
||||||
|
@ -19,9 +19,9 @@ import java.util.Map.Entry;
|
|||||||
|
|
||||||
public class MemoryDump implements Serializable {
|
public class MemoryDump implements Serializable {
|
||||||
transient long id;
|
transient long id;
|
||||||
transient Map<Object, Long> allocated; //js对象,id
|
transient Map<Object, Long> allocated; // js对象,id
|
||||||
|
|
||||||
Map<Long, MemoryObject> objects; //id,memory对象
|
Map<Long, MemoryObject> objects; // id,memory对象
|
||||||
JSEDump jseDump;
|
JSEDump jseDump;
|
||||||
|
|
||||||
transient Map<Long, Object> recreate;
|
transient Map<Long, Object> recreate;
|
||||||
@ -100,10 +100,9 @@ public class MemoryDump implements Serializable {
|
|||||||
currID = id;
|
currID = id;
|
||||||
if (obj.getClass() == jdk.internal.dynalink.beans.StaticClass.class) {
|
if (obj.getClass() == jdk.internal.dynalink.beans.StaticClass.class) {
|
||||||
/*
|
/*
|
||||||
String obj2 = "jdk.internal.dynalink.beans.StaticClass.class";
|
* String obj2 = "jdk.internal.dynalink.beans.StaticClass.class"; if
|
||||||
if (allocated.containsKey(obj2))
|
* (allocated.containsKey(obj2)) return allocated.get(obj2); allocated.put(obj2,
|
||||||
return allocated.get(obj2);
|
* currID);
|
||||||
allocated.put(obj2, currID);
|
|
||||||
*/
|
*/
|
||||||
} else {
|
} else {
|
||||||
if (allocated.containsKey(obj))
|
if (allocated.containsKey(obj))
|
||||||
@ -137,12 +136,12 @@ public class MemoryDump implements Serializable {
|
|||||||
} else if (obj.getClass() == wrp.jdk.nashorn.internal.runtime.Undefined.class) {
|
} else if (obj.getClass() == wrp.jdk.nashorn.internal.runtime.Undefined.class) {
|
||||||
|
|
||||||
} else if (obj.getClass() == jdk.internal.dynalink.beans.StaticClass.class) {
|
} else if (obj.getClass() == jdk.internal.dynalink.beans.StaticClass.class) {
|
||||||
//regard as String
|
// regard as String
|
||||||
|
|
||||||
// MemoryObject mo = new MemoryObject(currID);
|
// MemoryObject mo = new MemoryObject(currID);
|
||||||
// mo.type = MOType.String;
|
// mo.type = MOType.String;
|
||||||
// mo.data = "jdk.internal.dynalink.beans.StaticClass";
|
// mo.data = "jdk.internal.dynalink.beans.StaticClass";
|
||||||
// objects.put(currID, mo);
|
// objects.put(currID, mo);
|
||||||
} else {
|
} else {
|
||||||
MOType type = MOType.getType(obj);
|
MOType type = MOType.getType(obj);
|
||||||
if (type.isPrimitive()) {
|
if (type.isPrimitive()) {
|
||||||
@ -151,7 +150,8 @@ public class MemoryDump implements Serializable {
|
|||||||
mo.data = obj;
|
mo.data = obj;
|
||||||
objects.put(currID, mo);
|
objects.put(currID, mo);
|
||||||
} else
|
} else
|
||||||
System.out.println("[MemoryDump] Allocat MetType:" + obj.getClass() + " now id=" + currID);
|
System.out.println(
|
||||||
|
"[MemoryDump] Allocat MetType:" + obj.getClass() + " now id=" + currID);
|
||||||
|
|
||||||
}
|
}
|
||||||
return currID;
|
return currID;
|
||||||
@ -203,10 +203,12 @@ public class MemoryDump implements Serializable {
|
|||||||
}
|
}
|
||||||
switch (mo.type) {
|
switch (mo.type) {
|
||||||
case JSArray:
|
case JSArray:
|
||||||
obj = ScriptObjectMirror.wrap(Global.allocate(new int[0]), JavaScriptEntry.getEngineGlobal());
|
obj = ScriptObjectMirror.wrap(Global.allocate(new int[0]),
|
||||||
|
JavaScriptEntry.getEngineGlobal());
|
||||||
break;
|
break;
|
||||||
case JSObject:
|
case JSObject:
|
||||||
obj = ScriptObjectMirror.wrap(new JO(PropertyMap.newMap()), JavaScriptEntry.getEngineGlobal());
|
obj = ScriptObjectMirror.wrap(new JO(PropertyMap.newMap()),
|
||||||
|
JavaScriptEntry.getEngineGlobal());
|
||||||
break;
|
break;
|
||||||
case JSFunction:
|
case JSFunction:
|
||||||
break;
|
break;
|
||||||
|
@ -13,7 +13,7 @@ import java.util.zip.GZIPOutputStream;
|
|||||||
|
|
||||||
public class MemoryDumpUtil {
|
public class MemoryDumpUtil {
|
||||||
public static final String STATELESS_MEMORY = "statelessContractMemory";
|
public static final String STATELESS_MEMORY = "statelessContractMemory";
|
||||||
public static AtomicInteger checkPointCounter; //用于common模式下的检查点计数
|
public static AtomicInteger checkPointCounter; // 用于common模式下的检查点计数
|
||||||
NashornScriptEngine engine;
|
NashornScriptEngine engine;
|
||||||
String dumpContent;
|
String dumpContent;
|
||||||
MemoryDump memoryDump = null;
|
MemoryDump memoryDump = null;
|
||||||
@ -30,11 +30,12 @@ public class MemoryDumpUtil {
|
|||||||
GZIPInputStream gzin = new GZIPInputStream(fileout);
|
GZIPInputStream gzin = new GZIPInputStream(fileout);
|
||||||
reader = new ObjectInputStream(gzin);
|
reader = new ObjectInputStream(gzin);
|
||||||
MemoryDump memoryDump = new MemoryDump();
|
MemoryDump memoryDump = new MemoryDump();
|
||||||
//memoryDump.objects = (Map<Long, MemoryObject>) reader.readObject();
|
// memoryDump.objects = (Map<Long, MemoryObject>) reader.readObject();
|
||||||
memoryDump = (MemoryDump) reader.readObject();
|
memoryDump = (MemoryDump) reader.readObject();
|
||||||
reader.close();
|
reader.close();
|
||||||
String ret = JsonUtil.toPrettyJson(memoryDump.objects);
|
String ret = JsonUtil.toPrettyJson(memoryDump.objects);
|
||||||
ret += ("<seperate>" + memoryDump.jseDump.invokeID + ";" + memoryDump.jseDump.ranSeed + ";" + memoryDump.jseDump.numsOfCopies + "");
|
ret += ("<seperate>" + memoryDump.jseDump.invokeID + ";" + memoryDump.jseDump.ranSeed
|
||||||
|
+ ";" + memoryDump.jseDump.numsOfCopies + "");
|
||||||
return ret;
|
return ret;
|
||||||
} catch (IOException | ClassNotFoundException e) {
|
} catch (IOException | ClassNotFoundException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@ -43,23 +44,14 @@ public class MemoryDumpUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
public static String getContentFromFile2(String path) {
|
* public static String getContentFromFile2(String path) { File file = new File(path);
|
||||||
File file = new File(path);
|
* ObjectInputStream reader; try { FileInputStream fileout = new FileInputStream(file); reader =
|
||||||
ObjectInputStream reader;
|
* new ObjectInputStream(fileout); String ret = (String)reader.readObject(); reader.close();
|
||||||
try {
|
* return ret; } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } return
|
||||||
FileInputStream fileout = new FileInputStream(file);
|
* null; }
|
||||||
reader = new ObjectInputStream(fileout);
|
|
||||||
String ret = (String)reader.readObject();
|
|
||||||
reader.close();
|
|
||||||
return ret;
|
|
||||||
} catch (IOException | ClassNotFoundException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//stateful 表示合约是有/无状态合约
|
// stateful 表示合约是有/无状态合约
|
||||||
public String dumpMemory(String path, boolean stateful) {
|
public String dumpMemory(String path, boolean stateful) {
|
||||||
synchronized (engine) {
|
synchronized (engine) {
|
||||||
String ret;
|
String ret;
|
||||||
@ -73,16 +65,21 @@ public class MemoryDumpUtil {
|
|||||||
long id = memoryDump.allocate(obj);
|
long id = memoryDump.allocate(obj);
|
||||||
root.addField(key, id);
|
root.addField(key, id);
|
||||||
}
|
}
|
||||||
memoryDump.jseDump = new JSEDump(JavaScriptEntry.invokeID, Long.parseLong(JavaScriptEntry.currentSyncUtil.contractID), JavaScriptEntry.numOfCopies);
|
memoryDump.jseDump = new JSEDump(JavaScriptEntry.invokeID,
|
||||||
|
Long.parseLong(JavaScriptEntry.currentSyncUtil.contractID),
|
||||||
|
JavaScriptEntry.numOfCopies);
|
||||||
ret = JsonUtil.toPrettyJson(memoryDump.objects);
|
ret = JsonUtil.toPrettyJson(memoryDump.objects);
|
||||||
} else { //无状态合约
|
} else { // 无状态合约
|
||||||
memoryDump.jseDump = new JSEDump(JavaScriptEntry.invokeID, Long.parseLong(JavaScriptEntry.currentSyncUtil.contractID), JavaScriptEntry.numOfCopies);
|
memoryDump.jseDump = new JSEDump(JavaScriptEntry.invokeID,
|
||||||
|
Long.parseLong(JavaScriptEntry.currentSyncUtil.contractID),
|
||||||
|
JavaScriptEntry.numOfCopies);
|
||||||
memoryDump.objects.clear();
|
memoryDump.objects.clear();
|
||||||
ret = JsonUtil.toPrettyJson(memoryDump.objects);
|
ret = JsonUtil.toPrettyJson(memoryDump.objects);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret += "--seperate--";
|
ret += "--seperate--";
|
||||||
ret += (memoryDump.jseDump.invokeID + ";" + memoryDump.jseDump.ranSeed + ";" + memoryDump.jseDump.numsOfCopies);
|
ret += (memoryDump.jseDump.invokeID + ";" + memoryDump.jseDump.ranSeed + ";"
|
||||||
|
+ memoryDump.jseDump.numsOfCopies);
|
||||||
|
|
||||||
if (path == null || path.equals("")) {
|
if (path == null || path.equals("")) {
|
||||||
return ret;
|
return ret;
|
||||||
@ -90,13 +87,14 @@ public class MemoryDumpUtil {
|
|||||||
|
|
||||||
File mem = new File(path);
|
File mem = new File(path);
|
||||||
File parent = mem.getParentFile();
|
File parent = mem.getParentFile();
|
||||||
if (!parent.exists()) parent.mkdirs();
|
if (!parent.exists())
|
||||||
|
parent.mkdirs();
|
||||||
ObjectOutputStream writer;
|
ObjectOutputStream writer;
|
||||||
try {
|
try {
|
||||||
FileOutputStream fileout = new FileOutputStream(mem);
|
FileOutputStream fileout = new FileOutputStream(mem);
|
||||||
GZIPOutputStream out = new GZIPOutputStream(fileout);
|
GZIPOutputStream out = new GZIPOutputStream(fileout);
|
||||||
writer = new ObjectOutputStream(out);
|
writer = new ObjectOutputStream(out);
|
||||||
//writer.writeObject(memoryDump.objects);
|
// writer.writeObject(memoryDump.objects);
|
||||||
writer.writeObject(memoryDump);
|
writer.writeObject(memoryDump);
|
||||||
writer.flush();
|
writer.flush();
|
||||||
writer.close();
|
writer.close();
|
||||||
@ -112,44 +110,25 @@ public class MemoryDumpUtil {
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
public String dumpMemory(String path) {
|
* public String dumpMemory(String path) { memoryDump = new MemoryDump(); Bindings bindings =
|
||||||
memoryDump = new MemoryDump();
|
* engine.getBindings(ScriptContext.ENGINE_SCOPE);
|
||||||
Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
|
* System.out.println("[MemoryDumpUtil] bindings size=" + bindings.size()); MemoryJSObject root
|
||||||
System.out.println("[MemoryDumpUtil] bindings size=" + bindings.size());
|
* = memoryDump.getRoot(); for (String key : bindings.keySet()) {
|
||||||
MemoryJSObject root = memoryDump.getRoot();
|
* System.out.println("[MemoryDumpUtil] dumpMemory " + key); Object obj = bindings.get(key);
|
||||||
for (String key : bindings.keySet()) {
|
* long id = memoryDump.allocate(obj); root.addField(key, id);
|
||||||
System.out.println("[MemoryDumpUtil] dumpMemory " + key);
|
*
|
||||||
Object obj = bindings.get(key);
|
* System.out.println("[root addFiled] key=" + key + " id=" + id); } String ret =
|
||||||
long id = memoryDump.allocate(obj);
|
* JsonUtil.toPrettyJson(memoryDump); dumpContent = ret;
|
||||||
root.addField(key, id);
|
*
|
||||||
|
* if(path == null || path.equals("")) { return ret; }
|
||||||
System.out.println("[root addFiled] key=" + key + " id=" + id);
|
*
|
||||||
}
|
* File mem = new File(path); File parent = mem.getParentFile(); if (!parent.exists())
|
||||||
String ret = JsonUtil.toPrettyJson(memoryDump);
|
* parent.mkdirs(); ObjectOutputStream writer; try { FileOutputStream fileout = new
|
||||||
dumpContent = ret;
|
* FileOutputStream(mem); writer = new ObjectOutputStream(fileout);
|
||||||
|
* writer.writeObject(dumpContent);
|
||||||
if(path == null || path.equals("")) {
|
*
|
||||||
return ret;
|
* writer.flush(); writer.close(); } catch (IOException e) { e.printStackTrace(); }
|
||||||
}
|
*
|
||||||
|
* memoryDump = null; return ret; }
|
||||||
File mem = new File(path);
|
|
||||||
File parent = mem.getParentFile();
|
|
||||||
if (!parent.exists())
|
|
||||||
parent.mkdirs();
|
|
||||||
ObjectOutputStream writer;
|
|
||||||
try {
|
|
||||||
FileOutputStream fileout = new FileOutputStream(mem);
|
|
||||||
writer = new ObjectOutputStream(fileout);
|
|
||||||
writer.writeObject(dumpContent);
|
|
||||||
|
|
||||||
writer.flush();
|
|
||||||
writer.close();
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
memoryDump = null;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package org.bdware.sc.memory;
|
package org.bdware.sc.memory;
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public class MemoryJSObject extends MemoryObject {
|
public class MemoryJSObject extends MemoryObject {
|
||||||
private static final long serialVersionUID = -2290414347562477503L;
|
private static final long serialVersionUID = -2290414347562477503L;
|
||||||
|
@ -28,7 +28,7 @@ public class MemoryRecoverUtil {
|
|||||||
this.resource = r;
|
this.resource = r;
|
||||||
}
|
}
|
||||||
|
|
||||||
//支持传入memory文件路径或者直接是memory的字符串
|
// 支持传入memory文件路径或者直接是memory的字符串
|
||||||
public void loadMemory(String path, boolean stateful) {
|
public void loadMemory(String path, boolean stateful) {
|
||||||
synchronized (engine) {
|
synchronized (engine) {
|
||||||
File file = new File(path);
|
File file = new File(path);
|
||||||
@ -39,9 +39,9 @@ public class MemoryRecoverUtil {
|
|||||||
GZIPInputStream gzin = new GZIPInputStream(fileout);
|
GZIPInputStream gzin = new GZIPInputStream(fileout);
|
||||||
ObjectInputStream reader = new ObjectInputStream(gzin);
|
ObjectInputStream reader = new ObjectInputStream(gzin);
|
||||||
|
|
||||||
// MemoryDump temp = new MemoryDump();
|
// MemoryDump temp = new MemoryDump();
|
||||||
// temp.objects = (Map<Long, MemoryObject>) reader.readObject();
|
// temp.objects = (Map<Long, MemoryObject>) reader.readObject();
|
||||||
// String content = JsonUtil.toPrettyJson(temp);
|
// String content = JsonUtil.toPrettyJson(temp);
|
||||||
|
|
||||||
MemoryDump temp = (MemoryDump) reader.readObject();
|
MemoryDump temp = (MemoryDump) reader.readObject();
|
||||||
String content = JsonUtil.toPrettyJson(temp.objects);
|
String content = JsonUtil.toPrettyJson(temp.objects);
|
||||||
@ -67,7 +67,7 @@ public class MemoryRecoverUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//memoryDump = MemoryDump.loadFromStr(content);
|
// memoryDump = MemoryDump.loadFromStr(content);
|
||||||
if (stateful) {
|
if (stateful) {
|
||||||
memoryDump = temp;
|
memoryDump = temp;
|
||||||
}
|
}
|
||||||
@ -75,7 +75,7 @@ public class MemoryRecoverUtil {
|
|||||||
} catch (IOException | ClassNotFoundException e) {
|
} catch (IOException | ClassNotFoundException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
} else { //直接传入的是字符串
|
} else { // 直接传入的是字符串
|
||||||
String[] strs = path.split("--seperate--");
|
String[] strs = path.split("--seperate--");
|
||||||
String content = strs[0];
|
String content = strs[0];
|
||||||
String jse = strs[1];
|
String jse = strs[1];
|
||||||
@ -103,7 +103,7 @@ public class MemoryRecoverUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stateful) { //有状态合约
|
if (stateful) { // 有状态合约
|
||||||
memoryDump = MemoryDump.loadFromStr(content);
|
memoryDump = MemoryDump.loadFromStr(content);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -114,7 +114,8 @@ public class MemoryRecoverUtil {
|
|||||||
ScriptObjectMirror global = (ScriptObjectMirror) objects.get(0L);
|
ScriptObjectMirror global = (ScriptObjectMirror) objects.get(0L);
|
||||||
Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
|
Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
|
||||||
for (Object key : global.keySet()) {
|
for (Object key : global.keySet()) {
|
||||||
if (global.get(key) != null) bindings.put((String) key, global.get(key));
|
if (global.get(key) != null)
|
||||||
|
bindings.put((String) key, global.get(key));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.memoryDump = null;
|
this.memoryDump = null;
|
||||||
@ -127,34 +128,20 @@ public class MemoryRecoverUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
public void loadMemory(String path) {
|
* public void loadMemory(String path) { try { String memory; File mem = new File(path);
|
||||||
try {
|
* FileInputStream fileout = new FileInputStream(mem); ObjectInputStream reader = new
|
||||||
String memory;
|
* ObjectInputStream(fileout); loadContent = (String) reader.readObject(); //
|
||||||
File mem = new File(path);
|
* System.out.println("[MemoryRecoverUtil] loadContent : \n" + loadContent); reader.close();
|
||||||
FileInputStream fileout = new FileInputStream(mem);
|
* memoryDump = MemoryDump.loadFromStr(loadContent);
|
||||||
ObjectInputStream reader = new ObjectInputStream(fileout);
|
*
|
||||||
loadContent = (String) reader.readObject();
|
*
|
||||||
// System.out.println("[MemoryRecoverUtil] loadContent : \n" + loadContent);
|
* String ret = JsonUtil.toPrettyJson(memoryDump); MemoryJSObject root = memoryDump.getRoot();
|
||||||
reader.close();
|
* Map<Long, Object> objects = memoryDump.recreateObject(); ScriptObjectMirror global =
|
||||||
memoryDump = MemoryDump.loadFromStr(loadContent);
|
* (ScriptObjectMirror) objects.get(0L); Bindings bindings =
|
||||||
|
* engine.getBindings(ScriptContext.ENGINE_SCOPE); for (Object key : global.keySet()) { if
|
||||||
|
* (global.get(key) != null) bindings.put((String) key, global.get(key)); } this.memoryDump =
|
||||||
String ret = JsonUtil.toPrettyJson(memoryDump);
|
* null; if (resource != null) ((Invocable) engine).invokeFunction("defineProp", "Resources",
|
||||||
MemoryJSObject root = memoryDump.getRoot();
|
* resource); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }
|
||||||
Map<Long, Object> objects = memoryDump.recreateObject();
|
* }
|
||||||
ScriptObjectMirror global = (ScriptObjectMirror) objects.get(0L);
|
|
||||||
Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
|
|
||||||
for (Object key : global.keySet()) {
|
|
||||||
if (global.get(key) != null)
|
|
||||||
bindings.put((String) key, global.get(key));
|
|
||||||
}
|
|
||||||
this.memoryDump = null;
|
|
||||||
if (resource != null)
|
|
||||||
((Invocable) engine).invokeFunction("defineProp", "Resources", resource);
|
|
||||||
} catch (Exception e) {
|
|
||||||
// TODO Auto-generated catch block
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
@ -11,11 +11,12 @@ import java.util.Map;
|
|||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
|
|
||||||
public class TransRecordUtil {
|
public class TransRecordUtil {
|
||||||
public static final int RESERVED = 20; //最近的多少次records内存也保存,如果一个节点距离集群当前的seq相差超过这个值,就不从本地恢复,让别的节点现场dump
|
public static final int RESERVED = 20; // 最近的多少次records内存也保存,如果一个节点距离集群当前的seq相差超过这个值,就不从本地恢复,让别的节点现场dump
|
||||||
public static final int DUMP_PERIOD = 50; //每满50次记录,就记录一次全量状态,清一次trans记录
|
public static final int DUMP_PERIOD = 50; // 每满50次记录,就记录一次全量状态,清一次trans记录
|
||||||
private static final Logger LOGGER = LogManager.getLogger(TransRecordUtil.class);
|
private static final Logger LOGGER = LogManager.getLogger(TransRecordUtil.class);
|
||||||
public Map<Integer, TransRecord> cacheTransRecords = new TreeMap<Integer, TransRecord>(); //TODO 认为其中records一定是seq连续的,否则可能有问题?
|
public Map<Integer, TransRecord> cacheTransRecords = new TreeMap<Integer, TransRecord>(); // TODO
|
||||||
//public PriorityQueue<TransRecord> transRecords = new PriorityQueue<TransRecord>();
|
// 认为其中records一定是seq连续的,否则可能有问题?
|
||||||
|
// public PriorityQueue<TransRecord> transRecords = new PriorityQueue<TransRecord>();
|
||||||
public TransRecord currentTransRecord;
|
public TransRecord currentTransRecord;
|
||||||
SyncMechUtil syncUtil;
|
SyncMechUtil syncUtil;
|
||||||
DesktopEngine engine;
|
DesktopEngine engine;
|
||||||
@ -30,20 +31,20 @@ public class TransRecordUtil {
|
|||||||
fileName = path;
|
fileName = path;
|
||||||
}
|
}
|
||||||
|
|
||||||
//每次事务开始时初始化
|
// 每次事务开始时初始化
|
||||||
public void startNext(String fun, JsonElement arg, int sequence) {
|
public void startNext(String fun, JsonElement arg, int sequence) {
|
||||||
//logger.debug("TransRecordUtil 开始记录事务");
|
// logger.debug("TransRecordUtil 开始记录事务");
|
||||||
currentTransRecord = new TransRecord(fun, arg, sequence);
|
currentTransRecord = new TransRecord(fun, arg, sequence);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startNext(String fun, JsonElement arg) {
|
public void startNext(String fun, JsonElement arg) {
|
||||||
//logger.debug("TransRecordUtil 开始记录事务");
|
// logger.debug("TransRecordUtil 开始记录事务");
|
||||||
currentTransRecord = new TransRecord(fun, arg);
|
currentTransRecord = new TransRecord(fun, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
//每次事务结束时记录
|
// 每次事务结束时记录
|
||||||
public synchronized void eachFinish() {
|
public synchronized void eachFinish() {
|
||||||
//logger.debug("TransRecordUtil 记录完一个事务 \n" + currentTransRecord.toString());
|
// logger.debug("TransRecordUtil 记录完一个事务 \n" + currentTransRecord.toString());
|
||||||
cacheTransRecords.put(currentTransRecord.seq, currentTransRecord);
|
cacheTransRecords.put(currentTransRecord.seq, currentTransRecord);
|
||||||
if (cacheTransRecords.size() == RESERVED) {
|
if (cacheTransRecords.size() == RESERVED) {
|
||||||
int temp = 0;
|
int temp = 0;
|
||||||
@ -54,10 +55,10 @@ public class TransRecordUtil {
|
|||||||
cacheTransRecords.remove(temp);
|
cacheTransRecords.remove(temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
appendTransFile(currentTransRecord); //执行前已经定序了,所以trans其实没必要定序
|
appendTransFile(currentTransRecord); // 执行前已经定序了,所以trans其实没必要定序
|
||||||
}
|
}
|
||||||
|
|
||||||
//追加写入最后一个TransRecord
|
// 追加写入最后一个TransRecord
|
||||||
public void appendTransFile(TransRecord record) {
|
public void appendTransFile(TransRecord record) {
|
||||||
syncUtil.filedTrans.getAndIncrement();
|
syncUtil.filedTrans.getAndIncrement();
|
||||||
|
|
||||||
@ -78,7 +79,7 @@ public class TransRecordUtil {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
//自动触发检查点
|
// 自动触发检查点
|
||||||
if (syncUtil.filedTrans.get() == DUMP_PERIOD) {
|
if (syncUtil.filedTrans.get() == DUMP_PERIOD) {
|
||||||
LOGGER.info("自动触发检查点 DUMP_PERIOD=" + DUMP_PERIOD);
|
LOGGER.info("自动触发检查点 DUMP_PERIOD=" + DUMP_PERIOD);
|
||||||
file = new File(syncUtil.memoryDir);
|
file = new File(syncUtil.memoryDir);
|
||||||
@ -106,7 +107,7 @@ public class TransRecordUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//sync文件删除第2,3行
|
// sync文件删除第2,3行
|
||||||
file = new File(syncUtil.syncDir + "/" + syncUtil.syncFileName);
|
file = new File(syncUtil.syncDir + "/" + syncUtil.syncFileName);
|
||||||
String firstLine = "";
|
String firstLine = "";
|
||||||
try {
|
try {
|
||||||
@ -143,7 +144,7 @@ public class TransRecordUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//record executeContract in current trans
|
// record executeContract in current trans
|
||||||
public void recordExecutes(String k, String v) {
|
public void recordExecutes(String k, String v) {
|
||||||
if (currentTransRecord != null) {
|
if (currentTransRecord != null) {
|
||||||
currentTransRecord.executes.put(k, v);
|
currentTransRecord.executes.put(k, v);
|
||||||
@ -155,13 +156,13 @@ public class TransRecordUtil {
|
|||||||
public String getCachedTransRecords(int start) {
|
public String getCachedTransRecords(int start) {
|
||||||
StringBuilder str = new StringBuilder();
|
StringBuilder str = new StringBuilder();
|
||||||
|
|
||||||
//先查看有没有第1个
|
// 先查看有没有第1个
|
||||||
if (!cacheTransRecords.containsKey(start))
|
if (!cacheTransRecords.containsKey(start))
|
||||||
return "";
|
return "";
|
||||||
|
|
||||||
synchronized (cacheTransRecords) {
|
synchronized (cacheTransRecords) {
|
||||||
int temp = -1;
|
int temp = -1;
|
||||||
int j = start - 1;//确保有从start开始的连续trans,j记录上一个i值
|
int j = start - 1;// 确保有从start开始的连续trans,j记录上一个i值
|
||||||
for (Integer i : cacheTransRecords.keySet()) {
|
for (Integer i : cacheTransRecords.keySet()) {
|
||||||
if (i >= start) {
|
if (i >= start) {
|
||||||
if (i == (j + 1)) {
|
if (i == (j + 1)) {
|
||||||
|
@ -34,7 +34,7 @@ public class TransRecoverUtil {
|
|||||||
while ((line = br.readLine()) != null) {
|
while ((line = br.readLine()) != null) {
|
||||||
String[] strs = line.split(";");
|
String[] strs = line.split(";");
|
||||||
String arg;
|
String arg;
|
||||||
if (strs.length < 5) { //调用记录参数为空
|
if (strs.length < 5) { // 调用记录参数为空
|
||||||
arg = null;
|
arg = null;
|
||||||
} else {
|
} else {
|
||||||
arg = strs[4];
|
arg = strs[4];
|
||||||
@ -46,7 +46,8 @@ public class TransRecoverUtil {
|
|||||||
System.out.println("恢复时加入 " + cur_read.toString());
|
System.out.println("恢复时加入 " + cur_read.toString());
|
||||||
}
|
}
|
||||||
if (strs[1].equals("true"))
|
if (strs[1].equals("true"))
|
||||||
cur_read = new TransRecord(strs[3], JsonUtil.parseString(arg), Integer.parseInt(strs[2]));
|
cur_read = new TransRecord(strs[3], JsonUtil.parseString(arg),
|
||||||
|
Integer.parseInt(strs[2]));
|
||||||
else
|
else
|
||||||
cur_read = new TransRecord(strs[3], JsonUtil.parseString(arg));
|
cur_read = new TransRecord(strs[3], JsonUtil.parseString(arg));
|
||||||
} else {
|
} else {
|
||||||
@ -83,7 +84,8 @@ public class TransRecoverUtil {
|
|||||||
ac.seq = curRecoverRecord.seq;
|
ac.seq = curRecoverRecord.seq;
|
||||||
LOGGER.info("[TransRecordUtil] redo 重新执行事务 " + ac.seq);
|
LOGGER.info("[TransRecordUtil] redo 重新执行事务 " + ac.seq);
|
||||||
}
|
}
|
||||||
System.out.println("[TransRecoverUtil] recover " + ac.needSeq + " " + ac.seq + " " + ac.getAction() + " " + ac.getArg());
|
System.out.println("[TransRecoverUtil] recover " + ac.needSeq + " " + ac.seq + " "
|
||||||
|
+ ac.getAction() + " " + ac.getArg());
|
||||||
|
|
||||||
ContractResult result = engine.executeContract(ac);
|
ContractResult result = engine.executeContract(ac);
|
||||||
|
|
||||||
@ -95,7 +97,7 @@ public class TransRecoverUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO
|
// TODO
|
||||||
public void recoverFromATransRecord(TransRecord record) {
|
public void recoverFromATransRecord(TransRecord record) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -42,7 +42,8 @@ public class DoipClusterServer extends DoipServerImpl {
|
|||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int startDoipServer(int startPort, JsonElement otherConfigs) throws InterruptedException {
|
public static int startDoipServer(int startPort, JsonElement otherConfigs)
|
||||||
|
throws InterruptedException {
|
||||||
try {
|
try {
|
||||||
int ret = DoipLocalSingleton.run(startPort, otherConfigs);
|
int ret = DoipLocalSingleton.run(startPort, otherConfigs);
|
||||||
return ret;
|
return ret;
|
||||||
@ -56,7 +57,10 @@ public class DoipClusterServer extends DoipServerImpl {
|
|||||||
repoIrpClient = new AuditIrpClient(config);
|
repoIrpClient = new AuditIrpClient(config);
|
||||||
EndpointInfo info = repoIrpClient.getEndpointInfo();
|
EndpointInfo info = repoIrpClient.getEndpointInfo();
|
||||||
if (info == null) {
|
if (info == null) {
|
||||||
String content = "{\"date\":\"2022-1-13\",\"name\":\"testrepoforaibd\",\"doId\":\"bdware.test.local/Repo\",\"address\":\"tcp://127.0.0.1:" + defaultDOIPServerPort + "\",\"status\":\"已审核\",\"protocol\":\"DOIP\",\"pubKey\":\"empty\",\"version\":\"2.1\"}";
|
String content =
|
||||||
|
"{\"date\":\"2022-1-13\",\"name\":\"testrepoforaibd\",\"doId\":\"bdware.test.local/Repo\",\"address\":\"tcp://127.0.0.1:"
|
||||||
|
+ defaultDOIPServerPort
|
||||||
|
+ "\",\"status\":\"已审核\",\"protocol\":\"DOIP\",\"pubKey\":\"empty\",\"version\":\"2.1\"}";
|
||||||
info = EndpointInfo.fromJson(content);
|
info = EndpointInfo.fromJson(content);
|
||||||
}
|
}
|
||||||
List<DoipListenerConfig> infos = new ArrayList<>();
|
List<DoipListenerConfig> infos = new ArrayList<>();
|
||||||
@ -65,7 +69,8 @@ public class DoipClusterServer extends DoipServerImpl {
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
DoipServiceInfo ret = new DoipServiceInfo(info.getDoId(), info.getPubKey(), defaultRepoType, infos);
|
DoipServiceInfo ret =
|
||||||
|
new DoipServiceInfo(info.getDoId(), info.getPubKey(), defaultRepoType, infos);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,12 +96,16 @@ public class DoipClusterServer extends DoipServerImpl {
|
|||||||
JsonObject functions = new JsonObject();
|
JsonObject functions = new JsonObject();
|
||||||
|
|
||||||
// 维护RouteInfo,将RouteInfo和doipOperationName的映射关系,以及所有Router中用得到的函数都维护好
|
// 维护RouteInfo,将RouteInfo和doipOperationName的映射关系,以及所有Router中用得到的函数都维护好
|
||||||
//TODO 移除这部分逻辑?
|
// TODO 移除这部分逻辑?
|
||||||
cn.maintainRouteJoinInfo(methodRouteInfoMap, methodJoinInfoMap, functions);
|
cn.maintainRouteJoinInfo(methodRouteInfoMap, methodJoinInfoMap, functions);
|
||||||
if (clusterInfo != null) repoHandleValues.add("clusterInfo", clusterInfo);
|
if (clusterInfo != null)
|
||||||
if (functions.size() > 0) repoHandleValues.add("functions", functions);
|
repoHandleValues.add("clusterInfo", clusterInfo);
|
||||||
if (methodRouteInfoMap.size() > 0) repoHandleValues.add("routeInfo", methodRouteInfoMap);
|
if (functions.size() > 0)
|
||||||
if (methodJoinInfoMap.size() > 0) repoHandleValues.add("joinInfo", methodJoinInfoMap);
|
repoHandleValues.add("functions", functions);
|
||||||
|
if (methodRouteInfoMap.size() > 0)
|
||||||
|
repoHandleValues.add("routeInfo", methodRouteInfoMap);
|
||||||
|
if (methodJoinInfoMap.size() > 0)
|
||||||
|
repoHandleValues.add("joinInfo", methodJoinInfoMap);
|
||||||
repoInfo.handleValues.addProperty("cluster", repoHandleValues.toString());
|
repoInfo.handleValues.addProperty("cluster", repoHandleValues.toString());
|
||||||
String updateRepoInfoRes = repoIrpClient.reRegister(repoInfo);
|
String updateRepoInfoRes = repoIrpClient.reRegister(repoInfo);
|
||||||
if (updateRepoInfoRes.equals("success")) {
|
if (updateRepoInfoRes.equals("success")) {
|
||||||
@ -104,7 +113,8 @@ public class DoipClusterServer extends DoipServerImpl {
|
|||||||
} else if (updateRepoInfoRes.equals("failed")) {
|
} else if (updateRepoInfoRes.equals("failed")) {
|
||||||
LOGGER.error("Failed to update cluster info to router");
|
LOGGER.error("Failed to update cluster info to router");
|
||||||
} else {
|
} else {
|
||||||
LOGGER.warn("Oops...The result of updating clusterInfo to the router is " + updateRepoInfoRes);
|
LOGGER.warn("Oops...The result of updating clusterInfo to the router is "
|
||||||
|
+ updateRepoInfoRes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,7 +100,8 @@ public class DoipLocalSingleton {
|
|||||||
ResultChecker checker = new ResultChecker();
|
ResultChecker checker = new ResultChecker();
|
||||||
server.start(checker);
|
server.start(checker);
|
||||||
checker.waitForResult(1000);
|
checker.waitForResult(1000);
|
||||||
if (checker.port > 0) return port;
|
if (checker.port > 0)
|
||||||
|
return port;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,9 +3,9 @@ package org.bdware.sc.syncMech;
|
|||||||
public class EstimateUtil {
|
public class EstimateUtil {
|
||||||
public static final String DUMP_TIME = "dumpTime";
|
public static final String DUMP_TIME = "dumpTime";
|
||||||
public static final String DUMP_TIMES = "dumpTimes";
|
public static final String DUMP_TIMES = "dumpTimes";
|
||||||
long dumpTime; //用时
|
long dumpTime; // 用时
|
||||||
long dumpTimes; //次数
|
long dumpTimes; // 次数
|
||||||
long dumpFile; //状态大小,dumpFile的次数也是dumpTimes
|
long dumpFile; // 状态大小,dumpFile的次数也是dumpTimes
|
||||||
|
|
||||||
public static final String LOADMEMORY_TIME = "loadMemoryTime";
|
public static final String LOADMEMORY_TIME = "loadMemoryTime";
|
||||||
public static final String LOADMEMORY_TIMES = "loadMemoryTimes";
|
public static final String LOADMEMORY_TIMES = "loadMemoryTimes";
|
||||||
|
@ -2,15 +2,15 @@ package org.bdware.sc.syncMech;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
public class SyncRecord implements Serializable{
|
public class SyncRecord implements Serializable {
|
||||||
SyncType type;
|
SyncType type;
|
||||||
String fileName; //eg:/memory/2020-...
|
String fileName; // eg:/memory/2020-...
|
||||||
|
|
||||||
public SyncRecord(SyncType t) {
|
public SyncRecord(SyncType t) {
|
||||||
this.type = t;
|
this.type = t;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SyncRecord(SyncType t,String str){
|
public SyncRecord(SyncType t, String str) {
|
||||||
type = t;
|
type = t;
|
||||||
fileName = str;
|
fileName = str;
|
||||||
}
|
}
|
||||||
@ -37,8 +37,8 @@ public class SyncRecord implements Serializable{
|
|||||||
return str.toString();
|
return str.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SyncRecord loadFromString(String str){
|
public static SyncRecord loadFromString(String str) {
|
||||||
String[] strs = str.split(";");
|
String[] strs = str.split(";");
|
||||||
return new SyncRecord(SyncType.convert(strs[0]),strs[1]);
|
return new SyncRecord(SyncType.convert(strs[0]), strs[1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,11 +2,11 @@ package org.bdware.sc.syncMech;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
public enum SyncType implements Serializable{
|
public enum SyncType implements Serializable {
|
||||||
Memory, Trace, Trans;
|
Memory, Trace, Trans;
|
||||||
|
|
||||||
public static SyncType convert(String str){
|
public static SyncType convert(String str) {
|
||||||
switch (str){
|
switch (str) {
|
||||||
case "Memory":
|
case "Memory":
|
||||||
return Memory;
|
return Memory;
|
||||||
case "Trace":
|
case "Trace":
|
||||||
|
@ -2,6 +2,6 @@ package org.bdware.sc.trace;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
public class JS implements Serializable{
|
public class JS implements Serializable {
|
||||||
|
|
||||||
}
|
}
|
@ -2,7 +2,7 @@ package org.bdware.sc.trace;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
public class JSArray extends JSScript implements Serializable{
|
public class JSArray extends JSScript implements Serializable {
|
||||||
|
|
||||||
public JSArray(int id) {
|
public JSArray(int id) {
|
||||||
this.objID = id;
|
this.objID = id;
|
||||||
|
@ -2,6 +2,6 @@ package org.bdware.sc.trace;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
public class JSNull extends JS implements Serializable{
|
public class JSNull extends JS implements Serializable {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -3,10 +3,9 @@ package org.bdware.sc.trace;
|
|||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* js中对象
|
* js中对象 ScriptObject JO
|
||||||
* ScriptObject JO
|
|
||||||
*/
|
*/
|
||||||
public class JSObject extends JSScript implements Serializable{
|
public class JSObject extends JSScript implements Serializable {
|
||||||
|
|
||||||
public JSObject(int id) {
|
public JSObject(int id) {
|
||||||
this.objID = id;
|
this.objID = id;
|
||||||
|
@ -2,7 +2,7 @@ package org.bdware.sc.trace;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
public class JSScript extends JS implements Serializable{
|
public class JSScript extends JS implements Serializable {
|
||||||
int objID;
|
int objID;
|
||||||
|
|
||||||
public int getObjID() {
|
public int getObjID() {
|
||||||
|
@ -2,6 +2,6 @@ package org.bdware.sc.trace;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
public class JSUndifined extends JS implements Serializable{
|
public class JSUndifined extends JS implements Serializable {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,8 @@ public class MethodInvokePrinter implements TraceMethod {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void tracePrint(final String tag, int pc, String methodName, final Object[] args, final Object result) {
|
public void tracePrint(final String tag, int pc, String methodName, final Object[] args,
|
||||||
|
final Object result) {
|
||||||
// boolean isVoid = type().returnType() == void.class;
|
// boolean isVoid = type().returnType() == void.class;
|
||||||
out.print(tag);
|
out.print(tag);
|
||||||
out.print(methodName + "_" + pc + "(");
|
out.print(methodName + "_" + pc + "(");
|
||||||
|
@ -24,14 +24,8 @@ public class ProgramPointCounter extends ContractProcess.Logger implements Trace
|
|||||||
int functionIndex = 0;
|
int functionIndex = 0;
|
||||||
public long gasValue = 0;
|
public long gasValue = 0;
|
||||||
|
|
||||||
public ProgramPointCounter(
|
public ProgramPointCounter(ByteArrayOutputStream bo, ContractProcess cp, long gasLimit,
|
||||||
ByteArrayOutputStream bo,
|
int functionIndex, long gasValue, long extraGas, String action,
|
||||||
ContractProcess cp,
|
|
||||||
long gasLimit,
|
|
||||||
int functionIndex,
|
|
||||||
long gasValue,
|
|
||||||
long extraGas,
|
|
||||||
String action,
|
|
||||||
HashMap<String, Long> countMap) {
|
HashMap<String, Long> countMap) {
|
||||||
super(new PrintStream(bo), cp);
|
super(new PrintStream(bo), cp);
|
||||||
// out = System.out;
|
// out = System.out;
|
||||||
@ -50,52 +44,33 @@ public class ProgramPointCounter extends ContractProcess.Logger implements Trace
|
|||||||
public String getOutputStr() {
|
public String getOutputStr() {
|
||||||
return bo.toString();
|
return bo.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
private void printObject(final Object arg) {
|
* private void printObject(final Object arg) { if (simple) return; if (arg instanceof
|
||||||
if (simple) return;
|
* ScriptObject) { final ScriptObject object = (ScriptObject) arg;
|
||||||
if (arg instanceof ScriptObject) {
|
*
|
||||||
final ScriptObject object = (ScriptObject) arg;
|
* boolean isFirst = true; final Set<Object> keySet = object.keySet(); //
|
||||||
|
* System.out.println("[keySet:]"); if (keySet.isEmpty()) {
|
||||||
boolean isFirst = true;
|
* out.print(ScriptRuntime.safeToString(arg)); } else { out.print("{ ");
|
||||||
final Set<Object> keySet = object.keySet();
|
*
|
||||||
// System.out.println("[keySet:]");
|
* for (final Object key : keySet) { if (!isFirst) { out.print(", "); }
|
||||||
if (keySet.isEmpty()) {
|
*
|
||||||
out.print(ScriptRuntime.safeToString(arg));
|
* out.print(key); out.print(":");
|
||||||
} else {
|
*
|
||||||
out.print("{ ");
|
* final Object value = object.get(key);
|
||||||
|
*
|
||||||
for (final Object key : keySet) {
|
* if (value instanceof ScriptObject) { out.print("..."); } else { printObject(value); }
|
||||||
if (!isFirst) {
|
*
|
||||||
out.print(", ");
|
* isFirst = false; }
|
||||||
}
|
*
|
||||||
|
* out.print(" }"); } } else { out.print(ScriptRuntime.safeToString(arg)); } }
|
||||||
out.print(key);
|
|
||||||
out.print(":");
|
|
||||||
|
|
||||||
final Object value = object.get(key);
|
|
||||||
|
|
||||||
if (value instanceof ScriptObject) {
|
|
||||||
out.print("...");
|
|
||||||
} else {
|
|
||||||
printObject(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
isFirst = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
out.print(" }");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
out.print(ScriptRuntime.safeToString(arg));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
*/
|
||||||
boolean initEnter = false;
|
boolean initEnter = false;
|
||||||
Stack<Integer> pcStack = new Stack<>();
|
Stack<Integer> pcStack = new Stack<>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void tracePrint(
|
public void tracePrint(final String tag, int pc, String methodName, final Object[] args,
|
||||||
final String tag, int pc, String methodName, final Object[] args, final Object result) {
|
final Object result) {
|
||||||
// System.out.println("!@#$%^&*" + tag + pc + methodName + args + result);
|
// System.out.println("!@#$%^&*" + tag + pc + methodName + args + result);
|
||||||
if (!initEnter) {
|
if (!initEnter) {
|
||||||
// System.out.println("[functionIndex]:" + countMap.get(String.valueOf(functionIndex)));
|
// System.out.println("[functionIndex]:" + countMap.get(String.valueOf(functionIndex)));
|
||||||
|
@ -2,7 +2,7 @@ package org.bdware.sc.trace;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
public class Trace implements Serializable{
|
public class Trace implements Serializable {
|
||||||
|
|
||||||
public String traceContent() {
|
public String traceContent() {
|
||||||
return "Trace Content";
|
return "Trace Content";
|
||||||
|
@ -7,10 +7,10 @@ import java.util.List;
|
|||||||
/*
|
/*
|
||||||
* 数组创建时有初始值,进行初始化
|
* 数组创建时有初始值,进行初始化
|
||||||
*/
|
*/
|
||||||
public class TraceInitArray extends Trace implements Serializable{
|
public class TraceInitArray extends Trace implements Serializable {
|
||||||
int arrayId; //被初始化的数组id
|
int arrayId; // 被初始化的数组id
|
||||||
List<Object> keys = new ArrayList<Object>(); //数组下标可能是整数,对象名等
|
List<Object> keys = new ArrayList<Object>(); // 数组下标可能是整数,对象名等
|
||||||
List<Object> values = new ArrayList<Object>(); //数组内内容
|
List<Object> values = new ArrayList<Object>(); // 数组内内容
|
||||||
|
|
||||||
public TraceInitArray(int id) {
|
public TraceInitArray(int id) {
|
||||||
this.arrayId = id;
|
this.arrayId = id;
|
||||||
@ -18,7 +18,7 @@ public class TraceInitArray extends Trace implements Serializable{
|
|||||||
values = new ArrayList<Object>();
|
values = new ArrayList<Object>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void put(Object key,Object value) {
|
public void put(Object key, Object value) {
|
||||||
keys.add(key);
|
keys.add(key);
|
||||||
values.add(value);
|
values.add(value);
|
||||||
}
|
}
|
||||||
@ -40,11 +40,11 @@ public class TraceInitArray extends Trace implements Serializable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String traceContent(){
|
public String traceContent() {
|
||||||
StringBuilder str = new StringBuilder();
|
StringBuilder str = new StringBuilder();
|
||||||
str.append("[TraceInitArray]\n");
|
str.append("[TraceInitArray]\n");
|
||||||
str.append("ArrayID=" + arrayId + "\n");
|
str.append("ArrayID=" + arrayId + "\n");
|
||||||
for(int i = 0;i < values.size();i++)
|
for (int i = 0; i < values.size(); i++)
|
||||||
str.append("key=" + keys.get(i) + ";value=" + values.get(i) + "\n");
|
str.append("key=" + keys.get(i) + ";value=" + values.get(i) + "\n");
|
||||||
return str.toString();
|
return str.toString();
|
||||||
}
|
}
|
||||||
|
@ -2,11 +2,11 @@ package org.bdware.sc.trace;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
public class TraceInitObject extends Trace implements Serializable{
|
public class TraceInitObject extends Trace implements Serializable {
|
||||||
int id;
|
int id;
|
||||||
int id2;
|
int id2;
|
||||||
|
|
||||||
public TraceInitObject(int id,int id2) {
|
public TraceInitObject(int id, int id2) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.id2 = id2;
|
this.id2 = id2;
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ import java.io.Serializable;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class TraceRecord implements Serializable{
|
public class TraceRecord implements Serializable {
|
||||||
private static final long serialVersionUID = 34643133713102276L;
|
private static final long serialVersionUID = 34643133713102276L;
|
||||||
|
|
||||||
public List<Trace> traces;
|
public List<Trace> traces;
|
||||||
@ -17,8 +17,8 @@ public class TraceRecord implements Serializable{
|
|||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
StringBuilder str = new StringBuilder();
|
StringBuilder str = new StringBuilder();
|
||||||
for(int i = 0;i < traces.size();i++) {
|
for (int i = 0; i < traces.size(); i++) {
|
||||||
//str.append("com/yancloud/sc/trace" + i + ":\n");
|
// str.append("com/yancloud/sc/trace" + i + ":\n");
|
||||||
str.append(traces.get(i).traceContent() + "\n");
|
str.append(traces.get(i).traceContent() + "\n");
|
||||||
}
|
}
|
||||||
return str.toString();
|
return str.toString();
|
||||||
|
@ -2,7 +2,6 @@ package org.bdware.sc.trace;
|
|||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.zip.GZIPInputStream;
|
import java.util.zip.GZIPInputStream;
|
||||||
@ -29,11 +28,11 @@ public class TraceRecordUtil {
|
|||||||
|
|
||||||
public ArrayList<TraceRecord> traceRecords;
|
public ArrayList<TraceRecord> traceRecords;
|
||||||
|
|
||||||
public TraceRecord currentTraceRecord; //当前事务中所有非TraceSet的trace
|
public TraceRecord currentTraceRecord; // 当前事务中所有非TraceSet的trace
|
||||||
public Map<Integer,TraceInitArray> currentArrayMap;
|
public Map<Integer, TraceInitArray> currentArrayMap;
|
||||||
public Map<TraceSetIdentifier,TraceSet> currentMap; //当前事务中所有TraceSet的精简记录
|
public Map<TraceSetIdentifier, TraceSet> currentMap; // 当前事务中所有TraceSet的精简记录
|
||||||
|
|
||||||
public TraceRecordUtil(DesktopEngine de,SyncMechUtil sync) {
|
public TraceRecordUtil(DesktopEngine de, SyncMechUtil sync) {
|
||||||
this.engine = de;
|
this.engine = de;
|
||||||
this.syncUtil = sync;
|
this.syncUtil = sync;
|
||||||
}
|
}
|
||||||
@ -85,7 +84,7 @@ public class TraceRecordUtil {
|
|||||||
return str.toString();
|
return str.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
//添加简化过的TraceSet
|
// 添加简化过的TraceSet
|
||||||
public void addSmpSet() {
|
public void addSmpSet() {
|
||||||
currentTraceRecord.traces.addAll(currentArrayMap.values());
|
currentTraceRecord.traces.addAll(currentArrayMap.values());
|
||||||
currentTraceRecord.traces.addAll(currentMap.values());
|
currentTraceRecord.traces.addAll(currentMap.values());
|
||||||
@ -93,7 +92,8 @@ public class TraceRecordUtil {
|
|||||||
|
|
||||||
public void saveTraceRecords(String fileName) {
|
public void saveTraceRecords(String fileName) {
|
||||||
if (traceRecords == null) {
|
if (traceRecords == null) {
|
||||||
System.out.println("[saveTraceRecords] traceRecords is null,can't save traceRecords to fill!");
|
System.out.println(
|
||||||
|
"[saveTraceRecords] traceRecords is null,can't save traceRecords to fill!");
|
||||||
}
|
}
|
||||||
|
|
||||||
File traceFile = new File(fileName + ".trace"); // trace文件名中不带时间
|
File traceFile = new File(fileName + ".trace"); // trace文件名中不带时间
|
||||||
@ -116,9 +116,9 @@ public class TraceRecordUtil {
|
|||||||
|
|
||||||
public void startRecordTrace() {
|
public void startRecordTrace() {
|
||||||
this.traceRecords = new ArrayList<TraceRecord>();
|
this.traceRecords = new ArrayList<TraceRecord>();
|
||||||
// recording = true;
|
// recording = true;
|
||||||
|
|
||||||
//set behavior
|
// set behavior
|
||||||
Context.TRACESETBEHAVIOR = new TraceSetBehavior() {
|
Context.TRACESETBEHAVIOR = new TraceSetBehavior() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -142,11 +142,11 @@ public class TraceRecordUtil {
|
|||||||
else
|
else
|
||||||
value = produceJS(value);
|
value = produceJS(value);
|
||||||
|
|
||||||
currentMap.put(new TraceSetIdentifier(id,key),new TraceSet(id,key,value));
|
currentMap.put(new TraceSetIdentifier(id, key), new TraceSet(id, key, value));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
//setup script object
|
// setup script object
|
||||||
Context.TRACESETUPSCRIPTOBJECT = new TraceSetupScriptObject() {
|
Context.TRACESETUPSCRIPTOBJECT = new TraceSetupScriptObject() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -159,11 +159,10 @@ public class TraceRecordUtil {
|
|||||||
TraceSetup tracesetup = new TraceSetup((JSScript) produceJS(arg));
|
TraceSetup tracesetup = new TraceSetup((JSScript) produceJS(arg));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* System.out.println("[startRecord] setupScriptObject argID=" +
|
* System.out.println("[startRecord] setupScriptObject argID=" + arg.getObjectID() +
|
||||||
* arg.getObjectID() + " map=" + map.size()); Iterator<String> keys =
|
* " map=" + map.size()); Iterator<String> keys = arg.propertyIterator();
|
||||||
* arg.propertyIterator(); while(keys.hasNext()) { String key = keys.next();
|
* while(keys.hasNext()) { String key = keys.next(); System.out.println(key + " ; "
|
||||||
* System.out.println(key + " ; " +
|
* + map.findProperty(key).getClass().getCanonicalName());
|
||||||
* map.findProperty(key).getClass().getCanonicalName());
|
|
||||||
* tracesetup.add(map.findProperty(key)); }
|
* tracesetup.add(map.findProperty(key)); }
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -171,7 +170,7 @@ public class TraceRecordUtil {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
//setup array
|
// setup array
|
||||||
Context.TRACESETUPARRAY = new TraceSetupArray() {
|
Context.TRACESETUPARRAY = new TraceSetupArray() {
|
||||||
@Override
|
@Override
|
||||||
public void trace(ArrayData arg, int id) {
|
public void trace(ArrayData arg, int id) {
|
||||||
@ -195,15 +194,15 @@ public class TraceRecordUtil {
|
|||||||
/*
|
/*
|
||||||
* Context.TRACESETGLOBALOBJECTPROTO = new TraceSetGlobalObjectProto() {
|
* Context.TRACESETGLOBALOBJECTPROTO = new TraceSetGlobalObjectProto() {
|
||||||
*
|
*
|
||||||
* @Override public void trace(int id, int id2,List<Object> keys,List<Object>
|
* @Override public void trace(int id, int id2,List<Object> keys,List<Object> values) {
|
||||||
* values) { System.out.println("[startRecord] set global object proto id=" + id
|
* System.out.println("[startRecord] set global object proto id=" + id + " id2=" + id2 +
|
||||||
* + " id2=" + id2 + " size=" + keys.size());
|
* " size=" + keys.size());
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* TraceInitObject traceinitobject = new TraceInitObject(id,id2); for(int i =
|
* TraceInitObject traceinitobject = new TraceInitObject(id,id2); for(int i = 0;i <
|
||||||
* 0;i < keys.size();i++) { System.out.println("i=" + i + " key=" + keys.get(i)
|
* keys.size();i++) { System.out.println("i=" + i + " key=" + keys.get(i) + " value=" +
|
||||||
* + " value=" + values.get(i)); } currentTraceRecord.record(traceinitobject); }
|
* values.get(i)); } currentTraceRecord.record(traceinitobject); }
|
||||||
*
|
*
|
||||||
* };
|
* };
|
||||||
*/
|
*/
|
||||||
@ -213,7 +212,7 @@ public class TraceRecordUtil {
|
|||||||
Context.TRACESETBEHAVIOR = null;
|
Context.TRACESETBEHAVIOR = null;
|
||||||
Context.TRACESETUPARRAY = null;
|
Context.TRACESETUPARRAY = null;
|
||||||
Context.TRACESETUPSCRIPTOBJECT = null;
|
Context.TRACESETUPSCRIPTOBJECT = null;
|
||||||
// recording = false;
|
// recording = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static JS produceJS(Object arg) {
|
public static JS produceJS(Object arg) {
|
||||||
@ -228,19 +227,20 @@ public class TraceRecordUtil {
|
|||||||
} else if (arg instanceof wrp.jdk.nashorn.internal.runtime.Undefined) {
|
} else if (arg instanceof wrp.jdk.nashorn.internal.runtime.Undefined) {
|
||||||
return new JSUndifined();
|
return new JSUndifined();
|
||||||
} else {
|
} else {
|
||||||
System.out.println("[produceJS] arg encounter new type!" + arg.toString() + " " + arg.getClass());
|
System.out.println(
|
||||||
|
"[produceJS] arg encounter new type!" + arg.toString() + " " + arg.getClass());
|
||||||
return new JS();
|
return new JS();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//每次事务开始时初始化
|
// 每次事务开始时初始化
|
||||||
public void startNext() {
|
public void startNext() {
|
||||||
currentTraceRecord = new TraceRecord();
|
currentTraceRecord = new TraceRecord();
|
||||||
currentArrayMap = new LinkedHashMap<Integer,TraceInitArray>();
|
currentArrayMap = new LinkedHashMap<Integer, TraceInitArray>();
|
||||||
currentMap = new LinkedHashMap<TraceSetIdentifier,TraceSet>();
|
currentMap = new LinkedHashMap<TraceSetIdentifier, TraceSet>();
|
||||||
}
|
}
|
||||||
|
|
||||||
//每次事务结束时记录
|
// 每次事务结束时记录
|
||||||
public void eachFinish() {
|
public void eachFinish() {
|
||||||
addSmpSet();
|
addSmpSet();
|
||||||
currentTraceRecord.record(new TraceDone(ScriptObject.getAllocID()));
|
currentTraceRecord.record(new TraceDone(ScriptObject.getAllocID()));
|
||||||
|
@ -50,9 +50,12 @@ public class TraceRecoverUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public TraceRecord getTraceRecord(int c) {
|
public TraceRecord getTraceRecord(int c) {
|
||||||
if (traceRecords == null) return null;
|
if (traceRecords == null)
|
||||||
else if (traceRecords.size() <= c) return null;
|
return null;
|
||||||
else return traceRecords.get(c);
|
else if (traceRecords.size() <= c)
|
||||||
|
return null;
|
||||||
|
else
|
||||||
|
return traceRecords.get(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getTraceRecordsContent() {
|
public String getTraceRecordsContent() {
|
||||||
@ -86,7 +89,8 @@ public class TraceRecoverUtil {
|
|||||||
|
|
||||||
for (String key : bindings.keySet()) {
|
for (String key : bindings.keySet()) {
|
||||||
Object obj = bindings.get(key);
|
Object obj = bindings.get(key);
|
||||||
if (obj instanceof ScriptObjectMirror) initRecoverMap((ScriptObjectMirror) obj);
|
if (obj instanceof ScriptObjectMirror)
|
||||||
|
initRecoverMap((ScriptObjectMirror) obj);
|
||||||
}
|
}
|
||||||
Context.setGlobal(JavaScriptEntry.getEngineGlobal());
|
Context.setGlobal(JavaScriptEntry.getEngineGlobal());
|
||||||
}
|
}
|
||||||
@ -137,31 +141,25 @@ public class TraceRecoverUtil {
|
|||||||
|
|
||||||
return "[recoverFromTraceRecord] recover all";
|
return "[recoverFromTraceRecord] recover all";
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 通过traceRecord进行恢复 从当前状态恢复到第c次执行之后的状态
|
* 通过traceRecord进行恢复 从当前状态恢复到第c次执行之后的状态
|
||||||
*/
|
*/
|
||||||
public String recoverFromTraceRecord(int c) {
|
public String recoverFromTraceRecord(int c) {
|
||||||
int oldflag = recoverFlag;
|
int oldflag = recoverFlag;
|
||||||
|
|
||||||
if (recoverFlag < 0) recoverInit();
|
if (recoverFlag < 0)
|
||||||
|
recoverInit();
|
||||||
|
|
||||||
if (recoverFlag > c) {
|
if (recoverFlag > c) {
|
||||||
System.out.println(
|
System.out.println("[recoverFromTraceRecord] recoverFlag now is " + recoverFlag
|
||||||
"[recoverFromTraceRecord] recoverFlag now is "
|
+ " ,can't recover to " + c + " !");
|
||||||
+ recoverFlag
|
|
||||||
+ " ,can't recover to "
|
|
||||||
+ c
|
|
||||||
+ " !");
|
|
||||||
return "recover from trace failed!";
|
return "recover from trace failed!";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c >= traceRecords.size()) {
|
if (c >= traceRecords.size()) {
|
||||||
System.out.println(
|
System.out.println("[recoverFromTraceRecord] traceRecords' size now is "
|
||||||
"[recoverFromTraceRecord] traceRecords' size now is "
|
+ traceRecords.size() + " ,can't recover to " + c + " !");
|
||||||
+ traceRecords.size()
|
|
||||||
+ " ,can't recover to "
|
|
||||||
+ c
|
|
||||||
+ " !");
|
|
||||||
return "recover from trace failed!";
|
return "recover from trace failed!";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -217,10 +215,8 @@ public class TraceRecoverUtil {
|
|||||||
|
|
||||||
if (trace.getObj() instanceof JSArray) {
|
if (trace.getObj() instanceof JSArray) {
|
||||||
id = ((JSArray) trace.getObj()).getObjID();
|
id = ((JSArray) trace.getObj()).getObjID();
|
||||||
obj =
|
obj = (ScriptObjectMirror) ScriptObjectMirror.wrap(Global.allocate(new int[0]),
|
||||||
(ScriptObjectMirror)
|
engine.getDesktopGlobal());
|
||||||
ScriptObjectMirror.wrap(
|
|
||||||
Global.allocate(new int[0]), engine.getDesktopGlobal());
|
|
||||||
obj.setObjectID(id);
|
obj.setObjectID(id);
|
||||||
} else if (trace.getObj() instanceof JSObject) {
|
} else if (trace.getObj() instanceof JSObject) {
|
||||||
|
|
||||||
@ -233,9 +229,8 @@ public class TraceRecoverUtil {
|
|||||||
* System.out.println("[recover setup JSObject] : "); id = ((JSObject)
|
* System.out.println("[recover setup JSObject] : "); id = ((JSObject)
|
||||||
* trace.getObj()).getObjID();
|
* trace.getObj()).getObjID();
|
||||||
*
|
*
|
||||||
* PropertyMap map = PropertyMap.newMap(); for(int i = 0;i <
|
* PropertyMap map = PropertyMap.newMap(); for(int i = 0;i < trace.proLength();i++) {
|
||||||
* trace.proLength();i++) { map.addProperty(trace.get(i)); } ScriptObject so =
|
* map.addProperty(trace.get(i)); } ScriptObject so = new JO(map);
|
||||||
* new JO(map);
|
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
@ -279,12 +274,14 @@ public class TraceRecoverUtil {
|
|||||||
// 目前JSArray和JSObject一样,可能可以简化
|
// 目前JSArray和JSObject一样,可能可以简化
|
||||||
else if (value instanceof JSArray)
|
else if (value instanceof JSArray)
|
||||||
value = getScriptObjectMirrorById(((JSArray) value).getObjID());
|
value = getScriptObjectMirrorById(((JSArray) value).getObjID());
|
||||||
else if (value instanceof String || value instanceof Integer || value instanceof Double) ;
|
else if (value instanceof String || value instanceof Integer || value instanceof Double)
|
||||||
|
;
|
||||||
else if (value instanceof JSNull) // 数组trace中可能存在null和Undifined类型,赋值时跳过
|
else if (value instanceof JSNull) // 数组trace中可能存在null和Undifined类型,赋值时跳过
|
||||||
return;
|
return;
|
||||||
else if (value instanceof JSUndifined) {
|
else if (value instanceof JSUndifined) {
|
||||||
return;
|
return;
|
||||||
} else System.out.println("[recoverSet] encounter new value type!" + value.toString());
|
} else
|
||||||
|
System.out.println("[recoverSet] encounter new value type!" + value.toString());
|
||||||
|
|
||||||
// 修改ScriptObjectMirror中的setMemeber,使它支持所有类型
|
// 修改ScriptObjectMirror中的setMemeber,使它支持所有类型
|
||||||
owner.setMember2(key, value);
|
owner.setMember2(key, value);
|
||||||
@ -294,8 +291,10 @@ public class TraceRecoverUtil {
|
|||||||
* 将bindings中的变量放入recoverMap 对于函数的scope中的对象以及对象中的对象的情况可以通过递归将所有需要的都放入recoverMap中
|
* 将bindings中的变量放入recoverMap 对于函数的scope中的对象以及对象中的对象的情况可以通过递归将所有需要的都放入recoverMap中
|
||||||
*/
|
*/
|
||||||
private void initRecoverMap(ScriptObjectMirror obj) {
|
private void initRecoverMap(ScriptObjectMirror obj) {
|
||||||
if (obj == null) return;
|
if (obj == null)
|
||||||
if (recoverMap.containsKey(obj.getObjectID())) return;
|
return;
|
||||||
|
if (recoverMap.containsKey(obj.getObjectID()))
|
||||||
|
return;
|
||||||
recoverMap.put(obj.getObjectID(), obj);
|
recoverMap.put(obj.getObjectID(), obj);
|
||||||
|
|
||||||
// 全局变量从bindings中获得
|
// 全局变量从bindings中获得
|
||||||
@ -309,10 +308,8 @@ public class TraceRecoverUtil {
|
|||||||
if (svalue.isFunction()) {
|
if (svalue.isFunction()) {
|
||||||
ScriptFunction sf = (ScriptFunction) svalue.getScriptObject();
|
ScriptFunction sf = (ScriptFunction) svalue.getScriptObject();
|
||||||
ScriptObject s = sf.getScope();
|
ScriptObject s = sf.getScope();
|
||||||
ScriptObjectMirror obj2 =
|
ScriptObjectMirror obj2 = (ScriptObjectMirror) ScriptObjectMirror.wrap(s,
|
||||||
(ScriptObjectMirror)
|
JavaScriptEntry.getEngineGlobal());
|
||||||
ScriptObjectMirror.wrap(
|
|
||||||
s, JavaScriptEntry.getEngineGlobal());
|
|
||||||
initRecoverMap(obj2);
|
initRecoverMap(obj2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -326,7 +323,8 @@ public class TraceRecoverUtil {
|
|||||||
ScriptObjectMirror so = null;
|
ScriptObjectMirror so = null;
|
||||||
|
|
||||||
// 从recoverMap中获得
|
// 从recoverMap中获得
|
||||||
if (recoverMap.containsKey(id)) return recoverMap.get(id);
|
if (recoverMap.containsKey(id))
|
||||||
|
return recoverMap.get(id);
|
||||||
|
|
||||||
System.out.println("[getScriptObjectMirrorById] can't find the ScriptObjectMirror by id!");
|
System.out.println("[getScriptObjectMirrorById] can't find the ScriptObjectMirror by id!");
|
||||||
return so;
|
return so;
|
||||||
|
@ -3,15 +3,14 @@ package org.bdware.sc.trace;
|
|||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 记录nashorn中setElem和setProp的trace
|
* 记录nashorn中setElem和setProp的trace 自定义对象和数组的set不同
|
||||||
* 自定义对象和数组的set不同
|
|
||||||
*/
|
*/
|
||||||
public class TraceSet extends Trace implements Serializable{
|
public class TraceSet extends Trace implements Serializable {
|
||||||
int owner; //该对象的id
|
int owner; // 该对象的id
|
||||||
Object key;
|
Object key;
|
||||||
Object value;
|
Object value;
|
||||||
|
|
||||||
public TraceSet(int id,Object k,Object v) {
|
public TraceSet(int id, Object k, Object v) {
|
||||||
owner = id;
|
owner = id;
|
||||||
key = k;
|
key = k;
|
||||||
value = v;
|
value = v;
|
||||||
@ -42,7 +41,7 @@ public class TraceSet extends Trace implements Serializable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String traceContent(){
|
public String traceContent() {
|
||||||
StringBuilder str = new StringBuilder();
|
StringBuilder str = new StringBuilder();
|
||||||
str.append("[TraceSet]\n");
|
str.append("[TraceSet]\n");
|
||||||
str.append("owner=" + owner + "\n");
|
str.append("owner=" + owner + "\n");
|
||||||
|
@ -4,56 +4,59 @@ public class TraceSetIdentifier {
|
|||||||
int owner;
|
int owner;
|
||||||
Object key;
|
Object key;
|
||||||
|
|
||||||
public TraceSetIdentifier(int id,Object k) {
|
public TraceSetIdentifier(int id, Object k) {
|
||||||
this.owner = id;
|
this.owner = id;
|
||||||
this.key = k;
|
this.key = k;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object obj) {
|
public boolean equals(Object obj) {
|
||||||
if(obj == null && this == null)
|
if (obj == null && this == null)
|
||||||
return true;
|
return true;
|
||||||
else if(obj == null && this != null)
|
else if (obj == null && this != null)
|
||||||
return false;
|
return false;
|
||||||
else if(obj != null && this == null)
|
else if (obj != null && this == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if(this == obj)
|
if (this == obj)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
TraceSetIdentifier obj2 = (TraceSetIdentifier)obj;
|
TraceSetIdentifier obj2 = (TraceSetIdentifier) obj;
|
||||||
|
|
||||||
if(this.owner != obj2.owner)
|
if (this.owner != obj2.owner)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if(this.key instanceof String && obj2.key instanceof String && obj2.key.equals(this.key))
|
if (this.key instanceof String && obj2.key instanceof String && obj2.key.equals(this.key))
|
||||||
return true;
|
return true;
|
||||||
else if(this.key instanceof Double && obj2.key instanceof Double && obj2.key.equals(this.key))
|
else if (this.key instanceof Double && obj2.key instanceof Double
|
||||||
|
&& obj2.key.equals(this.key))
|
||||||
return true;
|
return true;
|
||||||
else
|
else
|
||||||
System.out.println("[TraceSetIdentifier] error : encounter new key type : " + this.key.getClass().getName());
|
System.out.println("[TraceSetIdentifier] error : encounter new key type : "
|
||||||
|
+ this.key.getClass().getName());
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
int result = 17,temp = 0;
|
int result = 17, temp = 0;
|
||||||
result = 31 * result + owner;
|
result = 31 * result + owner;
|
||||||
|
|
||||||
if(key instanceof String) {
|
if (key instanceof String) {
|
||||||
String k = (String)key;
|
String k = (String) key;
|
||||||
result = result * 31 + k.hashCode();
|
result = result * 31 + k.hashCode();
|
||||||
result = result * 31 + temp;
|
result = result * 31 + temp;
|
||||||
}else if(key instanceof Double) {
|
} else if (key instanceof Double) {
|
||||||
double t = (Double)key;
|
double t = (Double) key;
|
||||||
temp = (int)t;
|
temp = (int) t;
|
||||||
result = result * 31 + temp;
|
result = result * 31 + temp;
|
||||||
}else {
|
} else {
|
||||||
System.out.println("[TraceSetIdentifier] error : encounter new key type : " + this.key.getClass().getName());
|
System.out.println("[TraceSetIdentifier] error : encounter new key type : "
|
||||||
|
+ this.key.getClass().getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(result < 0)
|
if (result < 0)
|
||||||
result = -result;
|
result = -result;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -9,8 +9,8 @@ import wrp.jdk.nashorn.internal.runtime.Property;
|
|||||||
/*
|
/*
|
||||||
* 记录nashorn中ScriptObject创建的trace
|
* 记录nashorn中ScriptObject创建的trace
|
||||||
*/
|
*/
|
||||||
public class TraceSetup extends Trace implements Serializable{
|
public class TraceSetup extends Trace implements Serializable {
|
||||||
JSScript obj; //被创建的ScriptObject
|
JSScript obj; // 被创建的ScriptObject
|
||||||
List<Property> properties;
|
List<Property> properties;
|
||||||
|
|
||||||
public TraceSetup(JSScript o) {
|
public TraceSetup(JSScript o) {
|
||||||
@ -35,17 +35,19 @@ public class TraceSetup extends Trace implements Serializable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String traceContent(){
|
public String traceContent() {
|
||||||
StringBuilder str = new StringBuilder();
|
StringBuilder str = new StringBuilder();
|
||||||
str.append("[TraceSetup]\n");
|
str.append("[TraceSetup]\n");
|
||||||
if(obj instanceof JSObject)
|
if (obj instanceof JSObject)
|
||||||
str.append(((JSObject)obj).getObjID() + "," + ((JSObject)obj).getClass()+ " " + /*map.toString() +*/ "\n");
|
str.append(((JSObject) obj).getObjID() + "," + ((JSObject) obj).getClass() + " "
|
||||||
else if(obj instanceof JSArray)
|
+ /* map.toString() + */ "\n");
|
||||||
str.append(((JSArray)obj).getObjID() + "," + ((JSArray)obj).getClass() + " " +/* map.toString() + */"\n");
|
else if (obj instanceof JSArray)
|
||||||
|
str.append(((JSArray) obj).getObjID() + "," + ((JSArray) obj).getClass() + " "
|
||||||
|
+ /* map.toString() + */"\n");
|
||||||
|
|
||||||
if(properties.size() > 0) {
|
if (properties.size() > 0) {
|
||||||
str.append("properties : " + "\n");
|
str.append("properties : " + "\n");
|
||||||
for(int i = 0;i < properties.size();i++)
|
for (int i = 0; i < properties.size(); i++)
|
||||||
str.append(properties.get(i) + "\n");
|
str.append(properties.get(i) + "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,12 +13,14 @@ public class DataXTest {
|
|||||||
File directory = new File("");
|
File directory = new File("");
|
||||||
String path = directory.getCanonicalPath();
|
String path = directory.getCanonicalPath();
|
||||||
try {
|
try {
|
||||||
BufferedReader bf = new BufferedReader(new FileReader("./src/test/data-mask/maskingJobs/config.json"));
|
BufferedReader bf = new BufferedReader(
|
||||||
while((s = bf.readLine()) != null) {
|
new FileReader("./src/test/data-mask/maskingJobs/config.json"));
|
||||||
|
while ((s = bf.readLine()) != null) {
|
||||||
content.append(s.trim());
|
content.append(s.trim());
|
||||||
}
|
}
|
||||||
s = content.toString();
|
s = content.toString();
|
||||||
} catch (Exception e) {}
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
String ans = mj.getMaskedData(s).getAsString();
|
String ans = mj.getMaskedData(s).getAsString();
|
||||||
System.out.println(ans);
|
System.out.println(ans);
|
||||||
}
|
}
|
||||||
|
@ -2,42 +2,43 @@ package org.bdware.analysis;
|
|||||||
|
|
||||||
public class DataBaseProcess {
|
public class DataBaseProcess {
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
// long timeJava;
|
// long timeJava;
|
||||||
// try {
|
// try {
|
||||||
// // start a process before
|
// // start a process before
|
||||||
// long startJava = System.currentTimeMillis();
|
// long startJava = System.currentTimeMillis();
|
||||||
// // authentication: user, dbname, pwd
|
// // authentication: user, dbname, pwd
|
||||||
// MongoCredential credential = MongoCredential.createCredential("yancloud-dbuser", "yancloud",
|
// MongoCredential credential = MongoCredential.createCredential("yancloud-dbuser",
|
||||||
// "yancloud-112".toCharArray());
|
// "yancloud",
|
||||||
// // connect to mongodb server
|
// "yancloud-112".toCharArray());
|
||||||
// ServerAddress addr = new ServerAddress("39.106.118.0", 27017);
|
// // connect to mongodb server
|
||||||
// List<MongoCredential> credentials = new ArrayList<MongoCredential>();
|
// ServerAddress addr = new ServerAddress("39.106.118.0", 27017);
|
||||||
// credentials.add(credential);
|
// List<MongoCredential> credentials = new ArrayList<MongoCredential>();
|
||||||
// // connect to mongodb database
|
// credentials.add(credential);
|
||||||
// // MongoClient mongoClient = new MongoClient(addr,
|
// // connect to mongodb database
|
||||||
// // Arrays.asList(credential));
|
// // MongoClient mongoClient = new MongoClient(addr,
|
||||||
// MongoClient mongoClient = new MongoClient(addr, credentials);
|
// // Arrays.asList(credential));
|
||||||
// MongoDatabase mongoDatabase = mongoClient.getDatabase("yancloud");
|
// MongoClient mongoClient = new MongoClient(addr, credentials);
|
||||||
// // list all the documents of collection
|
// MongoDatabase mongoDatabase = mongoClient.getDatabase("yancloud");
|
||||||
// MongoCollection<Document> collection = mongoDatabase.getCollection("containers");
|
// // list all the documents of collection
|
||||||
// FindIterable<Document> findIterable = collection.find();
|
// MongoCollection<Document> collection = mongoDatabase.getCollection("containers");
|
||||||
// MongoCursor<Document> mongoCursor = findIterable.iterator();
|
// FindIterable<Document> findIterable = collection.find();
|
||||||
// StringBuilder stringBuilder = new StringBuilder();
|
// MongoCursor<Document> mongoCursor = findIterable.iterator();
|
||||||
// while (mongoCursor.hasNext()) {
|
// StringBuilder stringBuilder = new StringBuilder();
|
||||||
// stringBuilder.append(mongoCursor.next().toJson());
|
// while (mongoCursor.hasNext()) {
|
||||||
// }
|
// stringBuilder.append(mongoCursor.next().toJson());
|
||||||
// System.out.println(stringBuilder);
|
// }
|
||||||
// timeJava = System.currentTimeMillis() - startJava;
|
// System.out.println(stringBuilder);
|
||||||
// System.out.println("DataBaseTest of Java: " + timeJava + "\n\t");
|
// timeJava = System.currentTimeMillis() - startJava;
|
||||||
// mongoClient.close();
|
// System.out.println("DataBaseTest of Java: " + timeJava + "\n\t");
|
||||||
// mongoClient = null;
|
// mongoClient.close();
|
||||||
//
|
// mongoClient = null;
|
||||||
// /*
|
//
|
||||||
// * findIterable.forEach(new Block<Document>() { public void apply(Document _doc)
|
// /*
|
||||||
// * { System.out.println(_doc.toJson()); } });
|
// * findIterable.forEach(new Block<Document>() { public void apply(Document _doc)
|
||||||
// */
|
// * { System.out.println(_doc.toJson()); } });
|
||||||
// } catch (Exception e) {
|
// */
|
||||||
// e.printStackTrace();
|
// } catch (Exception e) {
|
||||||
// }
|
// e.printStackTrace();
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,7 @@ public class NaiveDynamicTaintAnalysisTest extends NaiveDynamicTaintAnalysis {
|
|||||||
YJSCompiler compiler = new YJSCompiler();
|
YJSCompiler compiler = new YJSCompiler();
|
||||||
contractNode = compiler.compile(new FileInputStream(path), null);
|
contractNode = compiler.compile(new FileInputStream(path), null);
|
||||||
DesktopEngine engine = new DesktopEngine();
|
DesktopEngine engine = new DesktopEngine();
|
||||||
engine.loadContract(null,contractNode, false);
|
engine.loadContract(null, contractNode, false);
|
||||||
Map<String, byte[]> clzs = engine.dumpClass();
|
Map<String, byte[]> clzs = engine.dumpClass();
|
||||||
Map<String, MethodNode> methods = new HashMap<>();
|
Map<String, MethodNode> methods = new HashMap<>();
|
||||||
for (byte[] clz : clzs.values()) {
|
for (byte[] clz : clzs.values()) {
|
||||||
|
@ -8,8 +8,8 @@ public class FSAnalysisTest {
|
|||||||
public static void main(String[] args) throws Exception {
|
public static void main(String[] args) throws Exception {
|
||||||
Contract contract = new Contract();
|
Contract contract = new Contract();
|
||||||
FSAnalysis.isDebug = true;
|
FSAnalysis.isDebug = true;
|
||||||
String content =
|
String content = FileUtil.getFileContent(
|
||||||
FileUtil.getFileContent("/Users/hulingxuan/git/SmartContract/contractExamples/fsanlysis.yjs");
|
"/Users/hulingxuan/git/SmartContract/contractExamples/fsanlysis.yjs");
|
||||||
contract.setScript(null == content ? "" : content);
|
contract.setScript(null == content ? "" : content);
|
||||||
FSAnalysis.staticVerify(contract);
|
FSAnalysis.staticVerify(contract);
|
||||||
}
|
}
|
||||||
|
@ -42,13 +42,11 @@ public class MultiSourceTaintAyalysisTest extends MultiSourceTaintAnalysis {
|
|||||||
|
|
||||||
// contractNode = compiler.compile(new FileInputStream(path), "contract_main.yjs");
|
// contractNode = compiler.compile(new FileInputStream(path), "contract_main.yjs");
|
||||||
// contractNode = compiler.compile(new FileInputStream(path), "DORepo.yjs");
|
// contractNode = compiler.compile(new FileInputStream(path), "DORepo.yjs");
|
||||||
contractNode =
|
contractNode = compiler.compile(new ZipFile(
|
||||||
compiler.compile(
|
|
||||||
new ZipFile(
|
|
||||||
"/Users/huaqiancai/BDWare/BDContract/front-agent/./BDWareProjectDir/publicCompiled/StaticAnalysisExample_2020-07-09-00.ypk"))
|
"/Users/huaqiancai/BDWare/BDContract/front-agent/./BDWareProjectDir/publicCompiled/StaticAnalysisExample_2020-07-09-00.ypk"))
|
||||||
.mergeContractNode();
|
.mergeContractNode();
|
||||||
DesktopEngine engine = new DesktopEngine(); // engine.loadJar(zf);
|
DesktopEngine engine = new DesktopEngine(); // engine.loadJar(zf);
|
||||||
ContractResult result2 = engine.loadContract(null,contractNode, false);
|
ContractResult result2 = engine.loadContract(null, contractNode, false);
|
||||||
System.out.println("----LoadResult------");
|
System.out.println("----LoadResult------");
|
||||||
System.out.println(new Gson().toJson(result2));
|
System.out.println(new Gson().toJson(result2));
|
||||||
Map<String, byte[]> clzs = engine.dumpClass();
|
Map<String, byte[]> clzs = engine.dumpClass();
|
||||||
@ -78,8 +76,6 @@ public class MultiSourceTaintAyalysisTest extends MultiSourceTaintAnalysis {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
TaintResult.printer.setLabelOrder(cfg.getLabelOrder());
|
TaintResult.printer.setLabelOrder(cfg.getLabelOrder());
|
||||||
MultiSourceTaintAnalysis analysis = new MultiSourceTaintAnalysis(cfg);
|
MultiSourceTaintAnalysis analysis = new MultiSourceTaintAnalysis(cfg);
|
||||||
analysis.analysis();
|
analysis.analysis();
|
||||||
@ -95,7 +91,8 @@ public class MultiSourceTaintAyalysisTest extends MultiSourceTaintAnalysis {
|
|||||||
List<Integer> ids = map.get(i);
|
List<Integer> ids = map.get(i);
|
||||||
frontCF.addBB(bb, decompiled, ids, cfg);
|
frontCF.addBB(bb, decompiled, ids, cfg);
|
||||||
Set<BasicBlock> suc = cfg.getSucBlocks(bb);
|
Set<BasicBlock> suc = cfg.getSucBlocks(bb);
|
||||||
for (BasicBlock sucBB : suc) frontCF.addEdge(bb, sucBB);
|
for (BasicBlock sucBB : suc)
|
||||||
|
frontCF.addEdge(bb, sucBB);
|
||||||
}
|
}
|
||||||
TaintBB bb = cfg.getLastBlock();
|
TaintBB bb = cfg.getLastBlock();
|
||||||
cfg.printSelf();
|
cfg.printSelf();
|
||||||
@ -103,7 +100,8 @@ public class MultiSourceTaintAyalysisTest extends MultiSourceTaintAnalysis {
|
|||||||
// if(fn.functionName.equals("setDBInfo"))
|
// if(fn.functionName.equals("setDBInfo"))
|
||||||
// cfg.printSelf();
|
// cfg.printSelf();
|
||||||
|
|
||||||
if (bb != null) result.put(fn.functionName, bb.getResultWithTaintBit());
|
if (bb != null)
|
||||||
|
result.put(fn.functionName, bb.getResultWithTaintBit());
|
||||||
System.out.println("[ContractManager] verifyDone:" + fn.functionName);
|
System.out.println("[ContractManager] verifyDone:" + fn.functionName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,7 @@ public class NaiveTaintAnalysisTest extends NaiveTaintAnalysis {
|
|||||||
YJSCompiler compiler = new YJSCompiler();
|
YJSCompiler compiler = new YJSCompiler();
|
||||||
contractNode = compiler.compile(new FileInputStream(path), null);
|
contractNode = compiler.compile(new FileInputStream(path), null);
|
||||||
DesktopEngine engine = new DesktopEngine();
|
DesktopEngine engine = new DesktopEngine();
|
||||||
engine.loadContract(null,contractNode, false);
|
engine.loadContract(null, contractNode, false);
|
||||||
Map<String, byte[]> clzs = engine.dumpClass();
|
Map<String, byte[]> clzs = engine.dumpClass();
|
||||||
Map<String, MethodNode> methods = new HashMap<>();
|
Map<String, MethodNode> methods = new HashMap<>();
|
||||||
for (byte[] clz : clzs.values()) {
|
for (byte[] clz : clzs.values()) {
|
||||||
|
@ -44,8 +44,7 @@ public class PPCountTest extends PPCount {
|
|||||||
// flag++;
|
// flag++;
|
||||||
MethodNode mn = methods.get("log");
|
MethodNode mn = methods.get("log");
|
||||||
if (mn != null) {
|
if (mn != null) {
|
||||||
CFGraph cfg =
|
CFGraph cfg = new CFGraph(mn) {
|
||||||
new CFGraph(mn) {
|
|
||||||
@Override
|
@Override
|
||||||
public BasicBlock getBasicBlock(int id) {
|
public BasicBlock getBasicBlock(int id) {
|
||||||
return new BasicBlock(id);
|
return new BasicBlock(id);
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user